Commit graph

753 commits

Author SHA1 Message Date
Exzap
c891abcb74 PPCRec: Partial support for typed registers in RA 2025-04-26 00:22:37 +02:00
Exzap
e9c161c508 PPCRec: Initial support for typed registers 2025-04-26 00:22:37 +02:00
Exzap
4c948d4a51 PPCRec: Fix capitalization in include 2025-04-26 00:22:37 +02:00
Exzap
86b82be8ef PPCRec: Use agnostic breakpoints 2025-04-26 00:22:36 +02:00
Exzap
acfc27f9fc PPCRec: Use IMLReg type in FPR RA 2025-04-26 00:22:36 +02:00
Exzap
948e33f9bf PPCRec: Unify code + misc RA preparation
Whoopsie
2025-04-26 00:22:36 +02:00
Exzap
1f6f74d6ac PPCRec: Simplify PPC and IML logic instructions
Also implement PPC NAND instruction
2025-04-26 00:22:36 +02:00
Exzap
429413d88e PPCRec: Use IMLReg in more places, unify and simplify var names 2025-04-26 00:22:36 +02:00
Exzap
dd805cb483 PPCRec: Refactor load/store instructions 2025-04-26 00:22:36 +02:00
Exzap
81fd7c8d1f PPCRec: Refactoring and clean up 2025-04-26 00:22:36 +02:00
Exzap
ce9a48b987 PPCRec: Rework CR bit handling
CR bits are now resident in registers instead of being baked into the instruction definitions. Same for XER SO, and LWARX reservation EA and value.

Reworked LWARX/STWCX, CRxx ops, compare and branch instructions. As well as RC bit handling. Not all CR-related instructions are reimplemented yet.

Introduced atomic_cmp_store operation to allow implementing STWCX in architecture agnostic IML

Removed legacy CR-based compare and jump operations
2025-04-26 00:22:36 +02:00
Exzap
db1f9c162f PPCRec: Avoid complex optimizations in backend
It's better to do it in a lowering pass so that the backend code can be kept as simple as possible
2025-04-26 00:22:36 +02:00
Exzap
f305a2ba17 PPCRec: Rework carry bit and generalize carry IML instructions
Carry bit is now resident in a register-allocated GPR instead of being backed directly into IML instructions

All the PowerPC carry ADD* and SUB* instructions as well as SRAW/SRAWI have been reworked to use more generalized IML instructions for handling carry

IML instructions now support two named output registers instead of only one (easily extendable to arbitrary count)
2025-04-26 00:22:36 +02:00
Exzap
84909d109f PPCRec: Further unify CR code 2025-04-26 00:22:36 +02:00
Exzap
c5ef9a5a98 PPCRec: Streamline instructions + unify code for CR updates 2025-04-26 00:22:36 +02:00
Exzap
a51a8bb7d5 PPCRec: New compare and cond jump instrs, update RA
Storing the condition result in a register instead of imitating PPC CR lets us simplify the backend a lot. Only implemented as PoC for BDZ/BDNZ so far.
2025-04-26 00:22:36 +02:00
Exzap
d0590ef1f5 PPCRec: New x86-64 code emitter 2025-04-26 00:22:36 +02:00
Exzap
53436f1c79 PPCRec: Rename register constants to avoid name collision 2025-04-26 00:22:36 +02:00
Exzap
d420622da7 PPCRec: Make register pool for RA configurable 2025-04-26 00:22:35 +02:00
Exzap
c4fb7b74f8 PPCRec: Make LSWI/STWSI more generic + GPR temporaries storage 2025-04-26 00:22:35 +02:00
Exzap
d724dded8e PPCRec: Clean up unused flags 2025-04-26 00:22:35 +02:00
Exzap
0f1d7532a1 PPCRec: Remove now unused PPC_ENTER and jumpMarkAddress 2025-04-26 00:22:35 +02:00
Exzap
6cdcef880b PPCRec: Fix single segment loop not being detected
Also removed associatedPPCAddress field from IMLInstruction as it's no longer used
2025-04-26 00:22:35 +02:00
Exzap
bb6b18d78f PPCRec: Unify BCCTR and BCLR code
Instead of having fixed macros for BCCTR/BCCTRL/BCLR/BCLRL we now have only one single macro instruction that takes the jump destination as a register parameter.
This also allows us to reuse an already loaded LR register (by something like MTLR) instead of loading it again from memory.

As a necessary requirement for this: The register allocator now has support for read operations in suffix instructions
2025-04-26 00:22:35 +02:00
Exzap
f2a07ade4c PPCRec: Fix merge conflicts 2025-04-26 00:22:35 +02:00
Exzap
e1e710e3f5 PPCRec: Reworked IML builder to work with basic-blocks
Intermediate commit while I'm still fixing things but I didn't want to pile on too many changes in a single commit.
New:
Reworked PPC->IML converter to first create a graph of basic blocks and then turn those into IML segment(s). This was mainly done to decouple IML design from having PPC specific knowledge like branch target addresses. The previous design also didn't allow to preserve cycle counting properly in all cases since it was based on IML instruction counting.
The new solution supports functions with non-continuous body. A pretty common example for this is when functions end with a trailing B instruction to some other place.

Current limitations:
- BL inlining not implemented
- MFTB not implemented
- BCCTR and BCLR are only partially implemented

Undo vcpkg change
2025-04-26 00:22:35 +02:00
Exzap
0622631868 PPCRec: Move X64 files into subdirectory and rename 2025-04-26 00:22:35 +02:00
Exzap
da08eda506 PPCRec: Emit x86 movd for non-AVX + more restructuring 2025-04-26 00:22:35 +02:00
Exzap
411a83799c PPCRec: Move IML register allocator 2025-04-26 00:22:35 +02:00
Exzap
231b5c5dc3 PPCRec: Move IML optimizer file 2025-04-26 00:22:35 +02:00
Exzap
14d82ae4a5 PPCRec: Move analyzer file + move some funcs to IMLInstruction 2025-04-26 00:22:35 +02:00
Exzap
f95180d0fc PPCRec: Move debug printing + smaller clean up 2025-04-26 00:22:35 +02:00
Exzap
faf6c17438 PPCRec: Rename IML structs for better clarity 2025-04-26 00:22:34 +02:00
Exzap
4abd5127c0 PPCRec: Move Segment and Instruction struct into separate files 2025-04-26 00:22:34 +02:00
Exzap
ce5d010611 PPCRec: Use vector for instruction list 2025-04-26 00:22:34 +02:00
Exzap
d42ea6e5a8 PPCRec: Use vector for segment list + deduplicate RA file 2025-04-26 00:22:34 +02:00
Exzap
bbba516f08 Latte: Fix race condition on close during game boot 2025-04-26 00:22:34 +02:00
Exzap
06233e3462 UI: Fix wxWidgets debug assert
Some checks failed
Build check / build (push) Failing after 0s
Generate translation template / generate-pot (push) Failing after 36s
Adding the same component multiple times is not allowed. Use sizers instead
2025-04-16 14:36:11 +02:00
Exzap
4972381edc Vulkan: Fix imgui validation error when sRGB framebuffer is used 2025-04-15 22:46:19 +02:00
Exzap
cd6eb1097b Vulkan: Fix a validation error + minor code refactor
We were using VK_EXT_DEPTH_CLIP_ENABLE but didn't actually request it.

Also fixed an assert when closing Cemu caused by incorrectly tracking the number of allocated pipelines
2025-04-15 21:10:11 +02:00
Exzap
c4eab08f30 Update vcpkg
Some checks failed
Build check / build (push) Failing after 0s
Generate translation template / generate-pot (push) Failing after 1s
2025-04-03 19:11:14 +02:00
mitoposter
57ff99ce53
cubeb: Show default device option even if enumerating devices fails (#1515)
Some checks failed
Build check / build (push) Failing after 0s
Generate translation template / generate-pot (push) Failing after 36s
2025-03-19 17:06:55 +01:00
capitalistspz
8b5cafa98e
Wiimote/L2CAP: More accurate descriptions for descriptors (#1512) 2025-03-13 01:09:45 +01:00
Crementif
186e92221a
debugger: allow printing registers using logging breakpoint placeholders (#1510)
This allows a savy user, developer or modder to change the comment field of a logging breakpoint to include placeholders such as {r3} or {f3} to log the register values whenever that code is hit.
2025-03-07 23:40:17 +01:00
goeiecool9999
31d2db6f78 OpenGL: Add explicit/matching qualifiers in output shader interface
fixes issues with old intel drivers
2025-03-05 22:23:06 +01:00
capitalistspz
ebb5ab53e2
Add menu item for opening shader cache directory (#1494)
Some checks failed
Build check / build (push) Failing after 0s
Generate translation template / generate-pot (push) Failing after 8s
2025-02-14 20:56:51 +01:00
capitalistspz
a6fb0a48eb
BUILD.md: Provide more info about build configuration flags (#1486) 2025-02-04 10:56:33 +01:00
Exzap
ec2d7c086a coreinit: Clean up time functions
Some checks failed
Generate translation template / generate-pot (push) Failing after 34s
Build check / build (push) Failing after 40s
2025-01-30 03:49:17 +01:00
Exzap
c714e8cb6b coreinit: Time to tick conversion is unsigned
The result is treated as signed in most cases, but the calculation uses unsigned arithmetic.

As a concrete example where this matters, DS VC passes -1 (2^64-1) to OSWaitEventWithTimeout which internally causes an overflow. But only with unsigned arithmetic this will result in a large positive number that behaves like the intended infinite timeout. With signed arithmetic the result is negative and the events will timeout immediately.
2025-01-30 03:32:24 +01:00
goeiecool9999
e834515f43
Vulkan: Improve post-shutdown cleanup and minor improvements (#1401) 2025-01-23 21:20:03 +01:00