Commit Graph
100 Commits
Author SHA1 Message Date
JosJuice 388b1e861c Merge pull request #14230 from Sintendo/file-search
Common/FileSearch: Refactor DoFileSearch
2026-01-24 20:42:31 +01:00
JosJuice 3221e982d3 Merge pull request #13900 from JosJuice/jit-fma-double-rounding
Jit: Implement error-free transformation for single-precision FMA
2026-01-23 21:43:18 +01:00
JosJuice bd96de52b5 Merge pull request #14292 from Dentomologist/jitregister_fix_isenabled_when_using_vtune_without_perf
JitRegister: Fix IsEnabled when using VTune without perf
2026-01-19 20:52:15 +01:00
JosJuice b07c78aabe VideoCommon: Move TextureInfo getters to header
This improves my PC's performance on RS2 Hoth by... 0.1% or so, which I
think is within the margin of error. But this change also cuts down on
boilerplate.
2026-01-19 19:46:21 +01:00
JosJuice 3b1a4739bc JitArm64: Special-case fmadds with single-precision inputs
If all inputs to an fmadds instruction (including cousins like fmsubs,
fnmadd...) are single-precision, then the result is identical between a
double-precision calculation with an error-free transform (whether the
calculation is fused or not) and a single-precision FMA instruction
(must be fused). So as a performance optimization in JitArm64, if we
were going to use double precision with EFT but the inputs are singles,
instead we'll use a normal single-precision FMA instruction without
anything extra. This lets us skip both the EFT and double-to-single
conversions.

Also renaming `inaccurate_fma` to `nonfused` because it's confusing that
`inaccurate_fma` and `m_accurate_fmadds` have such similar names
despite controlling separate things.
2026-01-18 20:03:54 +01:00
JosJuice 58487f1633 Jit: Implement error-free transformation for single-precision FMA
This implements the equivalent of 07443e2d41 in Jit64 and JitArm64.
Aims to fix https://bugs.dolphin-emu.org/issues/13865.
2026-01-18 20:02:49 +01:00
JosJuice 6ac7ffcdd7 Jit64: Return FixupBranch from HandleNaNs
This will be used in the next commit to skip running code that's
unnecessary when the result is NaN.
2026-01-18 20:02:49 +01:00
JosJuice d5067b6276 Jit64: Replace MOVSD with MOVAPD in software FMA
Should be a little faster by avoiding false dependencies. Note that
there is one remaining MOVSD that really needs to be a MOVSD.
2026-01-18 20:02:49 +01:00
JosJuice caad84c636 JitArm64: Reduce register pressure for inaccurate FMA with accurate NaNs
If result_reg is set to a temporary register instead of VD because of
accurate NaNs, there's no need to allocate a secondary temporary
register because of inaccurate FMA.
2026-01-18 20:02:49 +01:00
JosJuice 84261cfc23 Arm64Emitter: Fix Q bit of vector SHL/URSHR encoding
This doesn't affect any existing callers, because all existing callers
use quad registers.
2026-01-18 20:02:49 +01:00
JosJuice fb07406f10 VideoCommon: Defer creating TextureInfo
TextureCacheBase::LoadImpl has a hot path where the passed-in
TextureInfo never gets used. Instead of passing in a TextureInfo, let's
pass in the stage and create the TextureInfo from the stage if needed.

This unlocks somewhere above an additional 4% performance boost in the
Hoth level of Rogue Squadron 2 on my PC. Performance varies, making it
difficult for me to measure, so treat this as a very approximate number.
2026-01-18 13:04:06 +01:00
JosJuice 75666604a2 Jit64: Add fres unit test 2026-01-18 11:21:35 +01:00
JosJuice addededecf JitArm64: Always use double precision for inaccurate FMA
When we're emulating single-precision FMA using an FMA instruction,
there's no precision benefit from using a double-precision instruction,
assuming all inputs are single-precision. But when we're emulating
single-precision FMA using separate multiplication and addition
instructions, there is.

This change increases the precision of inaccurate FMA to the same level
as Jit64, which matters since the only reason we have the inaccurate
FMA mode is for sync compatibility with Jit64.
2026-01-18 10:36:00 +01:00
JosJuice f7b4d2738b VideoCommon: Don't create mipmap vector in TextureInfo
The TextureInfo constructor creates a vector of MipLevels. This could be
good for performance if MipLevels are accessed very often for each
TextureInfo, but that's not the case. Dolphin creates thousands of
TextureInfos per second that it never accesses the mipmap levels of
because there's a hit in the texture cache, and in the uncommon case of
a texture cache miss, the mipmap levels only get looped through once.

To make the common case of texture cache hits as fast as possible, let's
not create a vector in the TextureInfo constructor. This commit
implements a custom iterator for MipLevels instead.

In my testing on the Death Star level of Rogue Squadron 2, this speeds
up TextureInfo::FromStage by 200%, giving an overall emulation speedup
of a bit over 1%. Results on the Hoth level are even better, with
TextureInfo::FromStage being close to 300% faster and overall emulation
being over 4% faster. (Single core, no GPU texture decoding.)
2026-01-17 17:57:07 +01:00
JosJuice 4c7cb2622f Merge pull request #14246 from LeddaZ/android-gitignore
Android: Add build output folders to gitignore
2026-01-14 18:54:16 +01:00
JosJuice 01b4f8bcf7 Merge pull request #14245 from LeddaZ/android-materialyou-fix
Android: Switch to Theme.Material3.DynamicColors
2026-01-14 18:54:05 +01:00
JosJuice a80734138e Merge pull request #14244 from LeddaZ/kotlin-compilerdsl
Android: Use compilerOptions block to specify JVM version
2026-01-14 18:53:37 +01:00
JosJuice 3c771ade4b HotkeyManager: Don't allocate heap memory in GetInput
Profiling Dolphin using Heaptrack, this turns out to be the cause of
more than half of all temporary allocations. Though since it's in a
separate thread, I suppose it wasn't affecting performance very much.
2026-01-11 21:14:34 +01:00
JosJuice c54dc9db60 JitRegister: Check IsEnabled before constructing string
Without this, every time we finalize a JIT block, we have to allocate
memory for a string and format the string.
2026-01-11 21:01:49 +01:00
JosJuice 3ea366119f Jit64: Make TrampolineInfo smaller
Combined with the previous commit, this brings the TrampolineInfo struct
down to 48 bytes. This matters, because Jit64 has a big
std::unordered_map where it stores many megabytes of TrampolineInfo
entries.

The key saving comes from shrinking the len member from u32 to u16. It
should be safe to even turn it into a u8, but going that far brings no
additional savings due to how the padding works out.
2026-01-11 19:12:26 +01:00
JosJuice 283218bc29 x64Emitter: Reduce padding in OpArg
By moving members of the OpArg struct around, we can cut down on how
much padding the struct needs. Now it has a size of 16 bytes, small
enough for function calls to pass it in two registers instead of on the
stack.
2026-01-11 19:07:08 +01:00
JosJuice 2098b4b1ca DSP: Remove HLEMemory functions
During my quest to rid Dolphin of the memory-unsafe GetPointer function,
I didn't realize that DSPHLE had its own set of memory access functions
that were essentially duplicating the standard ones. This commit gets
rid of them and replaces calls to them with calls to MemoryManager.
2026-01-05 16:15:17 +01:00
JosJuice 89a03199b1 Merge pull request #14247 from jordan-woyak/fix-wiiware
DiscIO/Volume: Fix CreateVolume for WiiWare.
2026-01-03 19:01:03 +01:00
JosJuice 09a0e95efe Merge pull request #14240 from JoshuaVandaele/curl-perl-warning
curl: Disable manual
2025-12-31 12:30:00 +01:00
JosJuice 7a0bceecb0 Merge pull request #14192 from jordan-woyak/sdl-version-bump
Externals: Update SDL to release-3.2.28.
2025-12-27 13:26:38 +01:00
JosJuice db6c3b783c Merge pull request #14234 from JoshuaVandaele/wunused-cpipeline
CustomPipeline: Remove unused functions
2025-12-27 11:17:27 +01:00
JosJuice 73f2ac6eb0 Merge pull request #14233 from Sintendo/fix-shader-resource-warning
VideoCommon: Fix ShaderResource init order warning
2025-12-27 11:16:21 +01:00
JosJuice fb492d98a1 Merge pull request #14231 from iwubcode/default_viewport_to_zero
VideoCommon: initialize stored viewport to 0
2025-12-27 11:15:25 +01:00
JosJuice 7e10515890 Merge pull request #14175 from LillyJadeKatrin/retroachievements-submodule-update
Update rcheevos lib to current develop
2025-12-22 14:51:08 +01:00
JosJuice a32779340e Translation resources sync with Transifex 2025-12-20 20:43:44 +01:00
JosJuice fca27c375a Jit64: Explicitly get imm for clobbered stores
If we're on an x64 CPU that doesn't have the MOVBE extension, trying to
SwapAndStore a host register results in that register's value getting
clobbered with the swapped value. Jit64::stX and Jit64::stXx detect this
case, and if necessary, emit a MOV to a register that's fine to clobber.

This logic was broken by the merge of PR 12134. Jit64::stX and
Jit64::stXx were assuming that if RegCache::IsImm returns true for a
guest register, calling RegCache::Use or RegCache::BindOrImm for that
guest register would result in an immediate. However, PR 12134 made it
possible for a guest register to have both a host register and an
immediate in the register cache at the same time. When this happens,
RegCache::IsImm returns true, yet RegCache::Use and RegCache::BindForImm
return an RCOpArg whose Location returns a host register. (To make it
extra confusing, RCOpArg::IsImm calls RegCache::IsImm if the RCOpArg
came from RegCache, so RCOpArg::IsImm returns true!)

To fix this, in cases where Jit64::stX and Jit64::stXx explicitly need
an immediate to avoid having to emit an extra MOV, let's call
RegCache::Imm32 so that we're certain that we're getting an immediate.

This fixes an issue on older x64 CPUs that manifested as e.g. completely
broken graphics in Spyro: Enter the Dragonfly.
2025-12-08 23:19:10 +01:00
JosJuice 48009fd898 Jit64: Return current value from RCOpArg::IsImm
The constant propagation PR made it so that a guest register can be
present in the register cache as both a host register and an immediate
at the same time. If such a guest register is requested from the
register cache, the register cache prefers returning it as a host
register. However, RCOpArg::IsImm still returns true in this case. This
is confusing, especially since OpArg::IsImm does not return true if the
RCOpArg is converted into an OpArg.

This commit makes RCOpArg::IsImm check whether RCOpArg::Location returns
an immediate, so that RCOpArg::IsImm returns false when a host register
is being used. Code that wants to know whether an immediate exists in
the register cache rather than whether an immediate is currently being
used should call RegCache::IsImm instead.
2025-12-07 23:09:07 +01:00
JosJuice 213dc1c9af Merge pull request #14178 from Dentomologist/jit64_avoid_passing_immediate_to_non_immediate_parameter
Jit64: Avoid passing immediate to non-immediate parameter
2025-12-01 20:01:52 +01:00
JosJuice efa8439b79 Merge pull request #14186 from JoshuaVandaele/dit-crash-fix
DITConfiguration: Prevent a crash if images fail to load
2025-12-01 20:00:19 +01:00
JosJuice 582d5cfe96 Merge pull request #14188 from JosJuice/jit64-flush-carry
Jit64: Flush carry flag in FallBackToInterpreter
2025-12-01 19:58:38 +01:00
JosJuice f842af8b03 Merge pull request #14182 from jordan-woyak/ra-hardcore-warning-size
DolphinQt: Use QtUtils::CreateIconWarning to make the RetroAchievements warning size consistent with other warnings.
2025-11-30 23:25:12 +01:00
JosJuice e27ec97b15 Merge pull request #14180 from jordan-woyak/mgba-link-fix
GBACore: Fix Pokemon GBA link.
2025-11-30 18:26:18 +01:00
JosJuice 0c024de591 Jit64: Flush carry flag in FallBackToInterpreter
We have an optimization where the guest carry flag is kept in the host
carry flag between certain back-to-back pairs of integer instructions.
If the second instruction falls back to the interpreter, then
FallBackToInterpreter should flush the carry flag to m_ppc_state,
otherwise the interpreter reads a stale carry flag and at some later
point Jit64 trips the "Attempt to modify flags while flags locked!"
assertion.

An alternative solution would be to not store the guest carry flag in
the host carry flag to begin with if we know the next instruction is
going to fall back to the interpreter, but knowing that in advance is
non-trivial. Since interpreter fallbacks aren't exactly intended to be
super optimized, I went for the flushing solution instead, which is how
JitArm64 already works. In most cases, the emitted code shouldn't even
differ between these two solutions.

Note that the problematic situation only happens if the first integer
instruction doesn't fall back to the interpreter but the second one
does. This used to be impossible because there's no "JIT disable"
setting that's granular enough to disable some integer instructions but
not all, but with the constant propagation PR, it's possible if constant
propagation is able to entirely evaluate the first instruction but not
the second.
2025-11-29 11:45:43 +01:00
JosJuice 2e0b91c627 Merge pull request #14177 from JoshuaVandaele/retro-tests-off
Disable PatchAllowlistTest if USE_RETRO_ACHIEVEMENTS is OFF
2025-11-27 19:58:22 +01:00
JosJuice 27ec54eaaf Merge pull request #14179 from Tilka/ax_lpf
AX: fix low-pass filter edge case
2025-11-27 19:37:47 +01:00
JosJuice 887c68eed4 Translation resources sync with Transifex 2025-11-26 20:51:23 +01:00
JosJuice 807488caf9 Merge pull request #14066 from Biendeo/master
IOS: Logitech USB Microphone Basic Support
2025-11-25 23:12:39 +01:00
JosJuice ab0601b06a DolphinQt: Adjust capitalization of "Select A Bluetooth Device" 2025-11-25 21:17:35 +01:00
JosJuice fa2a9e72f9 Merge pull request #14159 from JosJuice/android-retroachievements-login-gone
Android: Tweak dialog_login.xml layout
2025-11-25 20:52:29 +01:00
JosJuice 3f8de54f65 Merge pull request #14160 from JosJuice/android-retroachievements-more-options
Android: Add LeaderboardTrackerEnabled and ChallengeIndicatorsEnabled
2025-11-25 20:52:20 +01:00
JosJuice 37194c7b93 GameSettings: Use three-character INIs for newly added settings
This is a follow-up to 0f1ecf41f9. Our policy is to use three-character
game INIs for settings unless a game has multiple releases and the
setting shouldn't be applied to all of them.

SAHE69.ini was simply renamed to SAH.ini. RL6E69.ini was deleted
entirely, because RL6.ini already exists and contains the same setting.
2025-11-24 21:46:29 +01:00
JosJuice 1fa5accf03 Merge pull request #14165 from BSDKaffee/qt-6.10-fix
Fix build for non-Linux with Qt 6.10+
2025-11-24 18:37:23 +01:00
JosJuice 2d9f317f04 Core: Make s_cpu_thread_job_finished a local variable
Having it be static leads to a race condition if two different threads
call RunOnCPUThread with wait_for_completion set to true. (There's
currently nobody calling RunOnCPUThread from anything other than the
host thread, so this hasn't led to any consequences yet.)
2025-11-23 15:17:20 +01:00
JosJuice aeac5f1a58 Merge pull request #14107 from jordan-woyak/mGBA-version-bump
Externals: Update mGBA to latest master.
2025-11-23 14:38:39 +01:00
JosJuice a2d0ad6a64 Merge pull request #14120 from da-pwo/master
Flatpak: Allow access to native discord IPC socket for rich presence
2025-11-23 14:36:05 +01:00
JosJuice 5769fc7372 Merge pull request #14134 from jordan-woyak/mercusys-rtl-firmware
Bluetooth/RealtekFirmwareLoader: Add Mercusys MA530 to list.
2025-11-23 14:29:08 +01:00
JosJuice 79d74a3df1 Android: Add LeaderboardTrackerEnabled and ChallengeIndicatorsEnabled
This is an Android port of 7ed61c50a1. It looks like we don't have
descriptions for any of the RetroAchievements settings in the Android
GUI, so I haven't added descriptions for these two new settings either.
2025-11-23 11:17:16 +01:00
JosJuice 604e7fe833 Android: Use same margin above login text as below
This makes the login dialog look more balanced when "Logging In" or
"Login Failed" is visible.
2025-11-23 11:05:02 +01:00
JosJuice 738dcf86a6 Android: Remove unnecessary gravity in dialog_login.xml
Android Studio was complaining about these because their directions
didn't match the text alignment, but in this layout they have no effect
anyway.
2025-11-23 11:05:02 +01:00
JosJuice 9ec9b7d6f7 Android: Replace dialog_login.xml's invisible with gone
LoginDialog sets these to gone when a login starts or fails. Whether we
use gone or invisible needs to be consistent between LoginDialog and the
XML file, otherwise we'll blank space that shows up or disappears when
login starts or fails.
2025-11-23 11:03:09 +01:00
JosJuice 84397d19aa Translation resources sync with Transifex 2025-11-23 10:14:20 +01:00
JosJuice 490615c72a Merge pull request #14142 from JosJuice/directiofile-cant-create-saf
Common: Treat DirectIOFile as unable to create SAF files
2025-11-23 09:50:44 +01:00
JosJuice 30dbcb2f80 Merge pull request #14128 from jordan-woyak/fix-run-on-object-race
DolphinQt/QtUtils: Simplify RunOnObject and eliminate Common::Event race. Introduce Common::OneShotEvent class.
2025-11-22 21:52:17 +01:00
JosJuice f4f7424a9f Merge pull request #13583 from LillyJadeKatrin/retroachievements-android
Android Support for RetroAchievements
2025-11-22 17:00:03 +01:00
JosJuice 9883235c0c Common: Treat DirectIOFile as unable to create SAF files
In 405baed805, we made the assumption that whether OpenAndroidContent
is able to create a new file depends on the open mode, the document
provider, and the positions of the celestial bodies. However, I'm
fairly sure that it can't create files at all as currently implemented.

First, ContentResolver.openFileDescriptor is documented as throwing
FileNotFoundException if the file doesn't exist. Now, the SAF
documentation is notoriously unreliable on matters like these, and
document providers can do whatever they want anyway, so we can't
actually trust this to mean that FileNotFoundException will always
be thrown if the file doesn't exist. But second, the Dolphin function
ContentHandler.unmangle is also unable to handle files that don't
already exist (unless the passed-in URI isn't mangled to begin with,
but to the best of my knowledge, there's no way to get a non-mangled URI
for a file that doesn't exist (unless you make assumptions about how the
document provider's URI scheme works, which we don't do in Dolphin)).
Summed up, it looks a lot like OpenAndroidContent can't create files,
or at the very least can't do so reliably.

Therefore I'm making DirectIOFile throw an assertion and return false
in situations where it's being asked to create a file under SAF. For
reference, there's no code in Dolphin that actually tries to create a
file under SAF. In all instances where we use SAF to write to files, the
file is created by the system file picker before it returns the URI of
the file to us.

What does this change gain us? First, if someone in the future tries to
use DirectIOFile to create a file under SAF, they'll be immediately
informed that this isn't supported rather than discovering it doesn't
work and chalking it up to SAF being bad for unpredictable reasons.
Second, we get rid of a call to File::Exists, which is a notable
performance improvement for game list scanning due to SAF and Dolphin's
"unmangling" being bad for reasons that unfortunately are entirely
predictable to those of us who have stared into the SAF void.

I've tested that game list scanning and game conversion still works.
2025-11-18 23:17:03 +01:00
JosJuice 9cc4d1b835 Merge pull request #13748 from Dentomologist/autoupdatechecker_delete_old_updater_log_file
AutoUpdateChecker: Delete old Updater.log file
2025-11-18 18:12:47 +01:00
JosJuice 48d9a04383 Merge pull request #14132 from JosJuice/jitarm64-bindtoregister-getimm
JitArm64: Call GetImm before BindToRegister in subfcx
2025-11-18 17:53:13 +01:00
JosJuice 4cd78a11a2 Merge pull request #14139 from Simonx22/android/kotlin-serialization-plugin-update-111725
Android: Update Kotlin serialization plugin
2025-11-18 17:53:06 +01:00
JosJuice 0d22dc0392 Merge pull request #14106 from Simonx22/android/dependency-updates-11102544758
Android: Update dependencies
2025-11-17 20:29:21 +01:00
JosJuice f966c55e0c Merge pull request #14097 from Simonx22/android/network-helper-kotlin
Android: Convert NetworkHelper to Kotlin
2025-11-17 20:28:20 +01:00
JosJuice 49e9cd42d4 JitArm64: Call GetImm before BindToRegister in subfcx
When BindToRegister is called, the register cache marks the relevant
guest register as no longer containing an immediate. However, subfcx was
calling GetImm after BindToRegister. This led to a lot of panic alerts
after 2995aa5be4 added an assert to GetImm to check that the passed-in
register is an immediate.

Both before and after 2995aa5be4, the actual value of the immediate
wasn't overwritten by BindForRegister, only the fact that the register
is an immediate. Because of this, the emitted code happened to work
correctly.
2025-11-17 20:00:36 +01:00
JosJuice 56532c850f Merge pull request #14023 from JosJuice/android-overlay-ok
Android: Treat EmulationActivity dialog dismiss the same as OK
2025-11-16 18:36:08 +01:00
JosJuice b6e062f2e3 Merge pull request #13689 from JosJuice/lock-core-any-thread
Core: Let any thread call previously host-thread-only functions
2025-11-16 18:35:17 +01:00
JosJuice 3ff4985120 Merge pull request #12134 from JosJuice/jit-constprop
Jit: Extract immediate handling to separate ConstantPropagation class
2025-11-16 18:34:49 +01:00
JosJuice 41ab5c0ead Android: Ship Sys/Resources/
We were previously excluding this folder from Android builds because it
didn't contain any files that were used on Android. However, we now have
an OSD font file that we do want to use on Android, and there's also a
few PNG files that will be needed by the RetroAchievements integration.

In terms of file size, this is what gets added:

OSD font: 48.1 KiB
RetroAchievements graphics: 3.5 KiB
Unused graphics: 116.8 KiB

We're still excluding Sys/Themes/, which is 1.1 MiB and entirely unused.
2025-11-16 15:33:22 +01:00
JosJuice 91c3a58889 Merge pull request #13922 from TryTwo/imgui_add_default_font
OSD/Imgui: Add a better default font
2025-11-16 13:58:18 +01:00
JosJuice e0f52e5799 Merge pull request #14104 from Simonx22/android/remove-extract-native-libs
Android: Remove deprecated extractNativeLibs manifest flag
2025-11-16 12:10:16 +01:00
JosJuice b9d9f36ce5 JitArm64: Replace dirty flag and partially replace RegType enum
Like Jit64, JitArm64 now keeps track of the location of a guest register
using three booleans: Whether it is in ppcState, whether it is in a host
register, and whether it is a known immediate. The RegType enum remains
only for the purpose of keeping track of what format FPRs are stored in
in host registers.
2025-11-16 09:52:09 +01:00
JosJuice 2995aa5be4 JitArm64: Don't store immediate values in register cache
Like the previous commit did for Jit64, JitArm64 can now handle the
combination of a value simultaneously being in a host register and being
a known immediate.

Unlike with Jit64, I've put the codegen-affecting changes in this commit
and the move away from the RegType enum in a follow-up commit. This is
in part because the design of JitArm64 made it easy to implement the
codegen-affecting changes without combining it with a big bang
refactorization, and in part because we need to keep RegType around for
keeping track of different float formats in Arm64FPRCache, complicating
the refactorization a bit.
2025-11-16 09:52:09 +01:00
JosJuice 817bb9d94c Jit64: Don't store immediate values in register cache
They're now stored in ConstantPropagation instead.

I've also removed the LocationType enum. The location of each guest
register is now tracked using three booleans: Whether it is in ppcState,
whether it is in a host register, and whether it is a known immediate.
The first two of these booleans are stored in the register cache, and
the last one is stored in ConstantPropagation. This new model allows us
to handle the combination of a value simultaneously being in a host
register and being a known immediate. It also keeps track of which
registers are dirty, which was previously kept track of in X64CachedReg.

The old model maps to the new model as follows:

                                default    host_reg    immediate

Default                         true       false       false
Discarded                       false      false       false
Bound                           (!dirty)   true        false
Immediate                       false      false       true
SpeculativeImmediate            true       false       true
[previously unrepresentable]    (!dirty)   true        true
2025-11-16 09:52:09 +01:00
JosJuice 4114a0b506 Jit: Update constant propagation during instruction
This commit makes the JIT set/clear the individual registers of
ConstantPropagation immediately instead of at the end of the
instruction. This is needed to prevent Jit64::ComputeRC, which reads
from a register written to earlier during the same instruction, from
reading back stale register values from ConstantPropagation in the next
commit.
2025-11-16 09:52:07 +01:00
JosJuice 502b48a690 JitArm64: Make FlushRegisters unlock condition more robust
To find out whether a host register needs to be unlocked, FlushRegisters
checks if the guest register is known to be a zero immediate. This works
right now, but it will stop working correctly once we gain the ability
to have a guest register be a known immediate and be in a host register
at the same time, because a register that's known to be a zero immediate
may have had a host register allocated prior to the call to
FlushRegisters. Instead, we should check whether the register is
RegType::Register after we're done calling BindForRead.
2025-11-16 09:50:31 +01:00
JosJuice 7065b93ba5 JitArm64: Pass index to more Arm64GPRCache functions
This refactorization is needed for upcoming commits.
2025-11-16 09:50:31 +01:00
JosJuice 502317a485 Jit: Move rlwimix to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice bac911aac4 Jit: Move srawx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice c136fd9807 Jit: Move srwx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice bb645e6cbb Jit: Move slwx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 45760841b2 Jit: Move divwx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice fc6c278007 Jit: Move divwux to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice c7d8a0b276 Jit: Move subfic to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 204a8fbd53 Jit: Move subfx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 2134991be8 Jit: Move multiplication by 0 optimization to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 7456ba3d3d Jit: Move mullwx, mulhwx, mulhwux to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice b469981c72 Jit: Move mulli to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 1eea610375 Jit: Move addicx to ConstantPropagation
Note: Jit64 didn't support immediate handling for addic before.
2025-11-16 09:50:31 +01:00
JosJuice a3797778ff Jit: Move srawix to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 1a22bda0a7 Jit: Move rlwinmx and rlwnmx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 4c8995fae5 Jit: Move negx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 92a5a46b2c Jit: Move cntlzwx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice b506cb2ad8 Jit: Move extsXx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice f04417eb5a Jit: Move addx to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 77b46c30ad Jit: Move boolX to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 3a6eea74dd Jit: Move addix to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice 20332f441b Jit: Move reg_imm to ConstantPropagation 2025-11-16 09:50:31 +01:00
JosJuice f9601dc38c Jit: Extract immediate handling to separate ConstantPropagation class
Restructuring things in this way brings two immediate benefits:

* Code is deduplicated between Jit64 and JitArm64.
* Materializing an immediate value in a register no longer results in us
  forgetting what the immediate value was.

As a more long-term benefit, this lets us also run constant propagation
as part of PPCAnalyst, which could let us do cool stuff in the future
like statically determining whether a conditional branch will be taken.
But I have nothing concrete planned for that right now.
2025-11-16 09:50:31 +01:00