Skip to content

feat(libc): implement signed 64-bit minimum - #11300

Merged
adriadam10 merged 1 commit into
boykopovar:mainfrom
Danigamer05:feat/libc-signed-min64
Oct 27, 2026
Merged

adriadam10 merged 1 commit into
boykopovar:mainfrom
Danigamer05:feat/libc-signed-min64

Conversation

@Danigamer05

@Danigamer05 Danigamer05 commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

What

Add the missing libc export __std_min_8i (HWeZH0iNZU8): take a nonempty range of signed 64-bit elements and return the minimum value. The existing memcpy read helper accepts unaligned ranges and leaves input unchanged. Declare the export once in the public Api.hpp; tests use that header. Null, empty, reversed and partial-element ranges call NotImplemented_nid_no_patch; their native failure behavior remains unimplemented and is recorded in debt. Tests cover valid ranges without asserting those unsupported paths.

The contract comes from PPSA03671 v01.001.005's bundled libc.prx: RVA 0x62830, size 0x1f4, ELF SHA256 483961e086b8a1fffa8138b3c0badf798987fb5f35ec908d828946408be2d8a6. The original receives range pointers in rdi/rsi, reads 8-byte elements, compares them as signed values (vpcmpgtq at 0x62879, cmovl %rcx,%rax at 0x62a16) and returns the value in rax. It has no calls or image-relative data references. The isolated original function was also run directly on this Windows host from its mapped load segments, without relocations, module initialization or other module exports. This is a host differential, not a console measurement. Microsoft STL's public implementation independently corroborates the signed 64-bit value-returning signature. Implementation is a generic scalar scan written from this contract.

Before implementation, main and all 1,388 open PR heads were scanned for the function name and raw NID: no matches. No third-party code, module bytes or title files are added. No current title dependency, title unblock or performance improvement is claimed.

Tested

Current-main synchronization (27 October 2026). Exact tested/published head: 80bc31bb6c6828bfa6b4e9e90f29575f3d55411c. Main base: cb45ae2ddf6e113a4619e8fed91fe7b9333c5c0f.

  • Rebased from acf7780c57456890746f2ba23de407aa21d5c21d onto the two newer main commits. Main changed only the windows_crash_stack_words test regex in core/libs/prx/libc/CMakeLists.txt (fix(main): windows_crash_stack_words regex crossed by '~' in register dump #11633). The entire four-file contribution patch is byte-identical before and after the rebase; no implementation or regression assertion changed.
  • On this exact head, rebuilt libc and guest_vector_algorithms_tests in the existing full-project Release configurations. guest_vector_algorithms and public_headers pass 2/2 on Windows 11 / WinLibs GCC 15.2.0 and 2/2 on Ubuntu 24.04 WSL / GCC 13.3.0.
  • All seven synchronized helper PRs still merge cleanly in forward and reverse order, producing the same tree. Their new combined revision 7da0577e45f238c6bfa01a818bd7e27f727ebeff also builds and passes both focused tests on Windows and Ubuntu. This synchronization ran 32 focused checks in total across the seven individual heads and the combined head.
  • Conventions, whitespace and strict main-sync checks pass: one commit ahead and zero behind the main base above.
  • The combined production sources, headers and regression sources are byte-identical to the previous combined revision a27d73c1f43135378c54ed6477af71273135ec42; only the unrelated upstream CMake regex differs. The previous original-module differential, standalone-header and AddressSanitizer evidence below retains its stated revisions and was not rerun for this synchronization.
  • The full CTest suite and all 64 general standalone-header batches were not run. No console, title or GPU run and no performance claim.
Earlier implementation validation and provenance

Current-main refresh (27 October 2026). Exact tested/published head: acf7780c57456890746f2ba23de407aa21d5c21d. Fetched main base: 74acfad65b3f0fd4eab653f3a3989d298fba1157.

  • Rebased from cd8f897c707297017ea56922a6e897c3ed6214ef. The __std_min_8i production body is byte-identical to that head. Every existing main declaration and debt entry is preserved; the patch still changes only the implementation, public declaration, regression cases and debt entry.
  • Windows 11 x64, WinLibs GCC 15.2.0, Release, full-project configuration: rebuilt production libc and guest_vector_algorithms_tests; ctest --test-dir build -R "^(guest_vector_algorithms|public_headers)$" -V --output-on-failure passed 2/2 on this exact head (19.55 s).
  • Ubuntu 24.04 under WSL, GCC 13.3.0 and CMake 3.28.3, Release, full-project configuration in a separate native Linux checkout: rebuilt production libc and the focused executable; the same checks passed 2/2 on this exact head (14.68 s). The runtime uses its existing memory-comparison fallback when asynchronous userfaultfd write watching is unavailable.
  • The same focused checks also pass on the unmodified main base on both platforms. All seven remaining vector-helper PRs (feat(libc): implement unsigned 64-bit maximum #10460, feat(libc): implement unsigned 32-bit minimum #11295, feat(libc): implement signed 64-bit minimum #11300, feat(libc): implement signed 64-bit maximum #11302, feat(libc): implement unsigned 32-bit maximum #11304, feat(libc): implement signed 32-bit minimum value helper #11309 and feat(libc): implement signed 32-bit maximum value helper #11333), together with feat(libc): implement unsigned 64-bit minimum #11289 already in main, merge without content conflicts. Merging the seven in forward and reverse order produces the same tree. That combined revision a27d73c1f43135378c54ed6477af71273135ec42 also builds and passes both focused checks on Windows and Ubuntu.
  • The current feat(libc): implement _Thrd_lt #10788 head 92db947130efc9e7e12c492683329f2ebc3e1996 merges cleanly with the main base, each individual helper and the seven-helper composition. This is a content-merge check for feat(libc): implement _Thrd_lt #10788; its implementation was not part of the combined runtime run.
  • Conventions, whitespace and tools/check_main_sync.py --base origin/main --head acf7780c57456890746f2ba23de407aa21d5c21d --strict pass. The sync check is one ahead and zero behind the fetched main base above. Bundled dependencies use that base's pinned revisions; no contribution dependency was introduced.
  • public_headers audits unique declarations and umbrella coverage. Its current upstream 90-second timeout is unchanged. The full set of 64 standalone-header batches and the full CTest suite were not run; the targeted header checks below were added afterward.

Additional validation on 27 October 2026, combined revision a27d73c1f43135378c54ed6477af71273135ec42 (the same seven-helper composition described above):

  • The five standalone public libc headers (include/Api.hpp, include/exceptions/Runtime.hpp, include/exceptions/Unwind.hpp, include/SonyCrt.hpp, and libc.hpp), plus a compilation unit including all 368 library umbrellas together, pass with C++20 and -Werror on Windows/WinLibs GCC 15.2.0 and Ubuntu/GCC 13.3.0. Every header is included twice, and the existing checker also rejects third-party header dependencies: 6 compilation units per platform, all pass. This is targeted coverage, not the full 64-batch matrix.
  • A separate Ubuntu full-project configuration with ANYPS5_ENABLE_ASAN=ON, RelWithDebInfo, rebuilt libc and guest_vector_algorithms_tests. ASAN_OPTIONS=halt_on_error=1:detect_leaks=1 ctest --test-dir build-asan-libc-followup-20261027-a -R '^guest_vector_algorithms$' -V --output-on-failure passed 1/1, with no AddressSanitizer or LeakSanitizer finding.
  • These added checks ran on the combined revision, not on seven additional individual builds. The individual Windows/Ubuntu Release results above remain associated with their exact published heads.

The earlier differential and negative-control results below belong to their stated heads. The original-module differential was not rerun for this refresh. No console, title or GPU execution and no performance claim.

Earlier implementation validation and provenance

Current-main refresh (26 October 2026), exact published/tested head cd8f897c707297017ea56922a6e897c3ed6214ef, main base bf77a9e9cba4b02c358779b35295176dd9cae164:

  • Rebased from 365e892c73c65e042c82e57fbed626e1b2a1f530 onto the main base above. All existing main declarations and debt entries are retained. The __std_min_8i production function body is byte-identical to the previously reviewed head; the patch still changes only its implementation, public declaration, regression cases and debt entry.
  • Windows 11 x64, WinLibs GCC 15.2.0, Release, full-project configuration: rebuilt libc and guest_vector_algorithms_tests; ctest --test-dir build -R "^(guest_vector_algorithms|public_headers)$" -V --output-on-failure passed 2/2 on this exact head (19.11 s).
  • Ubuntu 24.04 under WSL, GCC 13.3.0 and CMake 3.28.3, Release, full-project configuration in a separate Linux checkout: rebuilt libc and the focused executable, and the same two tests passed 2/2 on this exact head (14.52 s). The runtime reports the existing unavailable asynchronous userfaultfd write-watch path and uses its memory-comparison fallback.
  • The two header audits ran separately after both platform builds completed, with the existing 30-second limit unchanged. public_headers is the unique-declaration and umbrella-coverage audit; standalone-header compilation batches and the full CTest suite were not run in this refresh.
  • tools/check_conventions.py --base origin/main, PR-diff whitespace checks and tools/check_main_sync.py --base origin/main --head cd8f897c707297017ea56922a6e897c3ed6214ef --strict pass. The sync check reports one commit ahead and zero behind the fetched main base above.
  • A trial merge of all six refreshed PRs together with independent feat(libc): implement unsigned 64-bit maximum #10460 and feat(libc): implement unsigned 64-bit minimum #11289 is clean. That composition was checked for content conflicts; the runtime results above are the individual PR runs.

The previous baseline, differential and negative-control evidence below belongs to the earlier heads stated there. The original-module comparison was not rerun for this rebase-only refresh, and no console measurement was made.

Earlier implementation validation and provenance

Base: 5b85225ef39b9321d8f5c251ecb391b8331e8aea. Published/tested head: 365e892c73c65e042c82e57fbed626e1b2a1f530.

  • Windows 11, AMD Ryzen 7 3700X, WinLibs MinGW-w64 GCC 15.2.0 r7, CMake 4.3.1, Release, bundled dependencies, BUILD_TESTING=ON, full-project configuration: production libs, relinker and guest_vector_algorithms_tests build. Both guest_vector_algorithms and public_headers pass with ctest --test-dir build -R "^(guest_vector_algorithms|public_headers)$" -V --output-on-failure. The differential is repeated against the final NID-patched production library.
  • The existing guest_vector_algorithms and public_headers pass on unmodified base 5b85225ef3. Added cases cover single values, all pairs of twelve signed edge values, negative/zero/positive and 32/64-bit boundaries, 20 lengths through 257 elements, offsets 0–31, unchanged input/canaries, repeated negative minima, all-maximum ranges and a unique wide negative minimum at every position.
  • Three independently rebuilt negative controls fail as expected: unsigned comparison, truncating later reads to signed 32 bits, and skipping the last element. Exact sources and binaries were restored afterward.
  • Original / NID-patched production candidate / independent signed-minimum reference: 8,689 cases, zero mismatches, including lengths 1–257 at offsets 0–31, 256 guard-page cases, each bit position, INT64_MIN/INT64_MAX and all 144 pairs of twelve edge values. Inputs remain unchanged.
  • Ubuntu 24.04 under WSL2, GCC 13.3.0, CMake 3.28.3, Release, bundled dependencies: full-project configuration; production libc and the focused executable build. The same two CTest tests pass on the published commit in a separate Linux checkout, clean for tested sources before and after the run. The runtime reports unavailable asynchronous userfaultfd write protection and uses its memory-comparison fallback. The first harness invocation stopped before compilation because its script had CRLF endings; it was corrected to LF and rerun.
  • Conventions and PR-diff whitespace checks pass. The public-header test is the unique-declaration/umbrella audit; standalone-header compilation batches and the full CTest suite were not run. No PS5 console, title, macOS or GPU execution; no performance claim.

Overlap: the required tools/pr_overlap.py --branch feat/libc-signed-min64 --repo boykopovar/AnyPS5 run against 5b85225ef39b9321d8f5c251ecb391b8331e8aea reports no confirmed overlap. Manually inspected all 37 stale shared-file patches against their merge bases: #5021, #5303, #6713, #7081, #7386, #7447, #7544, #7648, #7715, #8150, #8417, #9087, #9269, #9371, #9447, #9526, #9669, #9771, #9863, #9873, #9929, #10007, #10113, #10158, #10200, #10222, #10226, #10229, #10283, #10346, #10349, #10405, #10467, #10610, #10742, #10788, #10898. They change other debt entries and unrelated public exports; none changes this function or its neighboring vector declarations/debt entry. Those stale branches are not claimed merge-clean. Trial merges with our independent #10460, #11289 and #11295 all succeed without content conflicts; no dependency on them.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: n/a
  • AI-assisted: yes

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Progress report (e2d457b → 80bc31b)

📉 System libraries: 51.82% (-0.01%, +1 declared functions)

🆕 1 declared as stubs
Library Name
libc __std_min_8i_nid_postfix

Changed libraries (implemented exports)

Library Before After Change
libc 1395/1404 (99.36%) 1395/1405 (99.29%) -0.07 pp

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 5021 docs/dev/debt/libc.md
PR 6713 docs/dev/debt/libc.md
PR 7081 docs/dev/debt/libc.md
PR 7386 docs/dev/debt/libc.md
PR 7447 docs/dev/debt/libc.md
PR 7648 docs/dev/debt/libc.md
PR 7715 docs/dev/debt/libc.md
PR 8150 docs/dev/debt/libc.md
PR 8937 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 9371 docs/dev/debt/libc.md
PR 9447 docs/dev/debt/libc.md
PR 9526 docs/dev/debt/libc.md
PR 9929 docs/dev/debt/libc.md
PR 10324 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 10433 docs/dev/debt/libc.md
PR 10620 docs/dev/debt/libc.md
PR 11332 docs/dev/debt/libc.md

@wachi35676

Copy link
Copy Markdown
Contributor

Windows run of head 365e892c73c6 merged onto main 0f34ebb85, WinLibs GCC 15.2.0, Release. guest_vector_algorithms passes 2/2 with no warnings. I also merged this together with #11289 and #11295 onto main. All three merge cleanly in any order, including docs/dev/debt/libc.md, and the combined guest_vector_algorithms passes 3/3. So the three can land in any order.

AI-assisted: yes (Claude Code); results above were run on this machine.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The implementation and edge coverage look sound from the submitted diff. The branch is 148 commits behind current main; both Api.hpp and docs/dev/debt/libc.md changed after its merge base. Although the merge preview is clean and the reported Windows/WSL and combined-helper runs are useful, the contribution rules require branches to be based on and kept up to date with main. Please rebase onto current main and rerun the focused guest_vector_algorithms and public_headers checks on the resulting head before this is approved.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I refreshed the exact-head sync check against current upstream/main 204c6747d0a1cbaf932def3dea0778810cc3935e: this head is 1 ahead / 245 behind. The merge preview is clean, but Api.hpp and docs/dev/debt/libc.md changed on main since this branch’s base (#9269, #10354 and #10608); keep those declarations and debt entries when rebasing. The Windows/WSL and combined-helper results in the PR are useful but were run on an older base. Please rebase and rerun guest_vector_algorithms and public_headers on the resulting exact head. No new function-specific defect found.

@Danigamer05
Danigamer05 force-pushed the feat/libc-signed-min64 branch 2 times, most recently from cd8f897 to acf7780 Compare October 26, 2026 23:43
@Danigamer05
Danigamer05 force-pushed the feat/libc-signed-min64 branch from acf7780 to 80bc31b Compare October 27, 2026 01:11
@adriadam10 adriadam10 self-assigned this Oct 27, 2026
@adriadam10
adriadam10 dismissed MarcZX10’s stale review October 27, 2026 08:43

Dismissing a stale review: the requested changes were addressed after it (new head) and the merge queue blocks on it. Please request changes again if anything is still open.

@adriadam10
adriadam10 merged commit 6d99bf4 into boykopovar:main Oct 27, 2026
18 of 19 checks passed
@adriadam10

Copy link
Copy Markdown
Collaborator

Checked the diff against the existing __std_min_8u helper, the signed comparison and unaligned reads, the edge-row tests (signed pairs, lengths up to 257, offsets 0-31, unique negative minimum at every position) and the debt entry. The rebase MarcZX10 asked for is done; merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants