Skip to content

feat(libc): implement unsigned 32-bit maximum - #11304

Merged
oneandonlydean merged 1 commit into
boykopovar:mainfrom
Danigamer05:feat/libc-unsigned-max32
Oct 28, 2026
Merged

oneandonlydean merged 1 commit into
boykopovar:mainfrom
Danigamer05:feat/libc-unsigned-max32

Conversation

@Danigamer05

@Danigamer05 Danigamer05 commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

What

Add the missing libc export __std_max_4u (fxmF53LHALE): return the maximum value in a nonempty range of unsigned 32-bit elements. The existing memcpy read helper accepts unaligned input and leaves it untouched. The export is declared once in public Api.hpp, which the tests include. Null, empty, reversed and partial-element ranges call NotImplemented_nid_no_patch; native failure behavior for those cases is not reproduced and is recorded in debt. Tests cover valid inputs without pinning unsupported paths.

Contract evidence: the libc.prx bundled with PPSA03671 v01.001.005 exports this NID at RVA 0x635e0, size 0x1a2; ELF SHA256 483961e086b8a1fffa8138b3c0badf798987fb5f35ec908d828946408be2d8a6. Reading the original confirms range pointers in rdi/rsi, 4-byte elements, unsigned maximum selection (vpmaxud at 0x63620 and cmovbe %ecx,%eax at 0x63775) and a value returned in eax. It has no calls or image-relative data references. The original function was also run directly from its isolated mapped load segments on this Windows host without relocations, module initializers or other original exports. This is a host differential, not a console measurement. Microsoft STL's public implementation independently corroborates the unsigned 32-bit value-returning signature. The implementation is a generic scalar scan written from that contract.

Main (a3987a1ecad24fd8f3d7b41fdc1fd983e2042a8f) and all 1,377 open PR heads were scanned for the name and raw NID before implementation: 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: 5f08cbf1b3d800915add2582a2c8c7ccd3551f36. Main base: cb45ae2ddf6e113a4619e8fed91fe7b9333c5c0f.

  • Rebased from 9989ee731bc66cf1baf5be173b14ee73d4e6bb99 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: 9989ee731bc66cf1baf5be173b14ee73d4e6bb99. Fetched main base: 74acfad65b3f0fd4eab653f3a3989d298fba1157.

  • Rebased from 8c42218ac3131a214ea38f99b16884d753bfdbb0. The __std_max_4u 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.37 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.33 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 9989ee731bc66cf1baf5be173b14ee73d4e6bb99 --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 8c42218ac3131a214ea38f99b16884d753bfdbb0, main base bf77a9e9cba4b02c358779b35295176dd9cae164:

  • Rebased from b58a62b48b5f845dd4a93420534a767857165cdd onto the main base above. All existing main declarations and debt entries are retained. The __std_max_4u 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 (18.85 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.11 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 8c42218ac3131a214ea38f99b16884d753bfdbb0 --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: 504ea3b53b237a5ea99e6daeee23b1edf3758368. Tested/published head: b58a62b48b5f845dd4a93420534a767857165cdd.

  • 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: built production libs, relinker and guest_vector_algorithms_tests.
  • The existing guest_vector_algorithms and public_headers passed on unmodified main a3987a1ecad24fd8f3d7b41fdc1fd983e2042a8f. Added regression cases cover single values, all pairs of eight unsigned edge values, sign and 16/32-bit boundaries, 20 lengths through 257 elements, offsets 0–31, unchanged input and surrounding canaries, repeated maxima, all-zero ranges and a unique maximum at every position.
  • Three independently rebuilt negative controls fail as expected: signed comparison, truncation of later reads to 16 bits and skipping the last element. Exact sources and binaries were restored afterward.
  • ctest --test-dir build -R "^(guest_vector_algorithms|public_headers)$" -V --output-on-failure: both pass on Windows at the published head. public_headers is the unique-declaration and umbrella-coverage audit; standalone-header compilation batches and the full CTest suite were not run.
  • Original / NID-patched production candidate / independent unsigned-maximum reference: 8,577 cases, zero mismatches, including lengths 1–257 at offsets 0–31, 256 guard-page cases, each bit position, zero/UINT32_MAX and all pairs of eight 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 in a separate Linux checkout at the published commit, clean for tested sources before and after. The runtime reports unavailable asynchronous userfaultfd write protection and uses its memory-comparison fallback.
  • Conventions and PR-diff whitespace checks pass. No PS5 console, title, macOS or GPU execution; no performance claim.

Overlap: the required tools/pr_overlap.py --branch feat/libc-unsigned-max32 --repo boykopovar/AnyPS5 scan against 504ea3b53b237a5ea99e6daeee23b1edf3758368 was retained as a full checker snapshot. After rebasing to that main and relocating the debt entry, the branch comparison was rerun with the same checker against the unchanged snapshot: no confirmed overlap. All 50 stale shared-file patches were manually inspected against their merge bases: #5021, #5303, #6713, #7081, #7386, #7447, #7544, #7648, #7715, #8150, #8417, #9269, #9371, #9447, #9526, #9669, #9771, #9863, #9873, #9929, #10007, #10113, #10158, #10200, #10222, #10226, #10229, #10234, #10283, #10315, #10316, #10317, #10321, #10325, #10328, #10345, #10349, #10405, #10467, #10468, #10506, #10510, #10512, #10529, #10565, #10610, #10742, #10788, #10898, #10927. None changes this export or its adjacent declarations/debt entry. Those stale branches are not claimed merge-clean. Trial merges with our independent #10460, #11289, #11295, #11300 and #11302 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 → 5f08cbf)

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

🆕 1 declared as stubs
Library Name
libc __std_max_4u_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 9677 docs/dev/debt/libc.md
PR 9867 docs/dev/debt/libc.md
PR 9929 docs/dev/debt/libc.md
PR 10113 docs/dev/debt/libc.md
PR 10222 docs/dev/debt/libc.md
PR 10226 docs/dev/debt/libc.md
PR 10229 docs/dev/debt/libc.md
PR 10245 docs/dev/debt/libc.md
PR 10247 docs/dev/debt/libc.md
PR 10250 docs/dev/debt/libc.md
PR 10253 docs/dev/debt/libc.md
PR 10265 docs/dev/debt/libc.md
PR 10324 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 10349 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
PR 11664 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 11831 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 11848 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 11850 docs/dev/debt/libc.md
PR 11870 docs/dev/debt/libc.md
PR 12053 docs/dev/debt/libc.md
PR 12122 docs/dev/debt/libc.md

@wachi35676

Copy link
Copy Markdown
Contributor

Windows run of head b58a62b48b5f merged onto main 14eb2cda22d2, WinLibs GCC 15.2.0, Release. guest_vector_algorithms passes 2/2 with no warnings. I also merged all six open __std_min_*/__std_max_* PRs (#11289, #11295, #11300, #11302, #11304, #11309) onto that main. They merge without conflicts, each export is defined once, and the combined guest_vector_algorithms passes 3/3, so the order they land in doesn't matter.

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.

Reviewed the implementation directly. Its nonempty uint32_t range check makes the initial read valid under the stated contract; the existing unaligned-safe Read helper and unsigned comparison implement the observed reduction without modifying memory. Unsupported ranges route to NotImplemented_nid_no_patch and the exact remaining failure gap is recorded in libc debt. The direct original-module differential, independent reference, unaligned/canary/boundary coverage and negative controls provide strong evidence. Hosted policy and the Linux/macOS/Windows relinker, ASan, register-context, write-watch and public-header checks pass; Linux/Windows product jobs were skipped by path policy. No blocking issue found.

@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 exact implementation remains sound on the reviewed head, and the reported differential and regression evidence is strong. I refreshed branch sync against current upstream/main 204c6747d0a1cbaf932def3dea0778810cc3935e: this head is 1 ahead / 185 behind. The merge preview is clean; the only touched PR path changed on main since the base is docs/dev/debt/libc.md, so preserve both entries when rebasing. This request is for the repository branch rule to keep PRs current, not a newly found implementation defect. Please rebase and rerun guest_vector_algorithms and public_headers on the resulting exact head.

@Danigamer05
Danigamer05 force-pushed the feat/libc-unsigned-max32 branch from 9989ee7 to 5f08cbf Compare October 27, 2026 01:11
@oneandonlydean
oneandonlydean merged commit c9cc3b3 into boykopovar:main Oct 28, 2026
18 of 19 checks passed
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