Adds fmin, fminf, fminl, fmax, fmaxf and fmaxl, the remaining
missing members of the C99 minimum/maximum family, with the NaN
propagation and signed-zero handling guest_fminf pins down (host
std::fmin does not guarantee the sign of a zero result). The
previous libSceLibcInternal copy of fminf is removed so the export
stays single-owner. PPSA28319 imports fmaxf from libc.prx; the
other five names were exported by nothing.
On ds_ordered_count M0 holds the ordered wave ID, not a GDS address as
for ds_append: radeonsi and ACO pass the wave ID as the intrinsic's
pointer and keep the counter address in offset0. Reading M0 as the base
and size skipped the add whenever M0[15:0] was 0, so every wave got the
same range. The test now runs the ordered pass with M0 = 0 and M0 = 7.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
ds_ordered_count adds the first active lane's value to a GDS counter and
returns the previous value, like ds_append adds the lane count. Waves are
not serialized in launch order: each still gets its own range. Ordered
swap and multi-dword counts stay refused. DISPATCH_DIRECT and
DISPATCH_INDIRECT accept ORDERED_APPEND_ENBL (bit 3) of the initiator.
Compute shaders of MXGP 26 (PPSA30839) use both.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A plan copied every control-flow condition with all its operands, though one
that depends on a vector register is never evaluated. Such conditions are
dropped, and the copied values live in one arena without use lists.
Structurizing recomputes dominators after every CFG rewrite, and each block started from a vector of every block id. The same fixed point now runs on bitsets and still writes the sorted id lists.
Co-authored-by: Cursor <[email protected]>
Before: a dump taken straight from a package holds SELF containers, so the app
root has no ELF, and converting it answered "Expected exactly one executable ELF
in the app root; found 0" while the Convert button stayed disabled, with nothing
pointing at what was wrong. A sce_module entry that is a SELF was dropped as well
without a word, although docs/user/USAGE.md documents the relinker skipping
SELF/fSELF containers with a warning.
Now the first bytes of each root file are matched against SELF_MAGIC_PS4 and
SELF_MAGIC_PS5 (the two containers pkg-to-anyps5 unwraps), so an executable case
names the file and asks for the app to be unwrapped first, and a skipped module
joins the same warnings list the conversion gate already reads, which makes the
acknowledge box appear for it too.
VGT_TF_PARAM.PARTITIONING 3 now compiles to Vulkan's fractional-even
spacing, which radeonsi programs as PART_FRAC_EVEN. Its factors are
bounded at 64 like integer partitioning; Vulkan raises the remaining
ones to at least 2, the D3D11 range for this mode.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Use the published, checksum-verified library archive when GitHub's public rate limit prevents the latest-release check. Keep rejecting other request failures and version mismatches, and cover both paths in the worker test.\n\nCo-authored-by: Copilot <[email protected]>
Below 1 fps no one-second window holds two presents, so the overlay
showed FPS: 0.0, GPU: 0.0 MS and DRIVER: 0.0 MS, which is the common
case for titles that run slowly today. When the last second holds fewer
than two presents, FPS is now the last frame's rate, 1000 divided by its
time in ms, and GPU and DRIVER are that frame's growth of each total.
With two or more presents in the last second the numbers are the last
second's as before, so the two modes meet at 1 fps.
FPS below 1 is shown with two decimals: a frame every 2 s reads 0.50 and
one every 12 s reads 0.08. Times keep their format and their 9999 cap,
which USAGE.md now states for frames of 10 s or more. Nothing changes
while the overlay is hidden.