aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2024-02-08 16:17:47 -0300
committerGitHub <noreply@github.com>2024-02-08 20:17:47 +0100
commitea07328aea4b6d70f5d5aa2c3c3874a748854ba1 (patch)
treefe457b413e0abb7dd48073659ef3c3aa3f9229a9 /src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs
parenta0b3d82ee0d808b894de3a2e61b78f48aec5ffb0 (diff)
LightningJit: Reduce stack usage for Arm32 code (#6245)
* Write/read guest state to context for sync points, stop reserving stack for them * Fix UsedGprsMask not being updated when allocating with preferencing * POP should be also considered a return
Diffstat (limited to 'src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs')
-rw-r--r--src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs
index e0a18e66..8a2b389a 100644
--- a/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs
@@ -208,6 +208,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32
InstMeta meta;
InstFlags extraFlags = InstFlags.None;
bool hasHostCall = false;
+ bool hasHostCallSkipContext = false;
bool isTruncated = false;
do
@@ -246,9 +247,17 @@ namespace Ryujinx.Cpu.LightningJit.Arm32
meta = InstTableA32<T>.GetMeta(encoding, cpuPreset.Version, cpuPreset.Features);
}
- if (meta.Name.IsSystemOrCall() && !hasHostCall)
+ if (meta.Name.IsSystemOrCall())
{
- hasHostCall = meta.Name.IsCall() || InstEmitSystem.NeedsCall(meta.Name);
+ if (!hasHostCall)
+ {
+ hasHostCall = InstEmitSystem.NeedsCall(meta.Name);
+ }
+
+ if (!hasHostCallSkipContext)
+ {
+ hasHostCallSkipContext = meta.Name.IsCall() || InstEmitSystem.NeedsCallSkipContext(meta.Name);
+ }
}
insts.Add(new(encoding, meta.Name, meta.EmitFunc, meta.Flags | extraFlags));
@@ -259,8 +268,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm32
if (!isTruncated && IsBackwardsBranch(meta.Name, encoding))
{
- hasHostCall = true;
isLoopEnd = true;
+ hasHostCallSkipContext = true;
}
return new(
@@ -269,6 +278,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32
insts,
!isTruncated,
hasHostCall,
+ hasHostCallSkipContext,
isTruncated,
isLoopEnd,
isThumb);