From 7e209bfe8f13332f05353cd970aae554de5ddba1 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 22 Apr 2024 12:15:37 -0300 Subject: [PATCH] Single block mode for LightningJit --- src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs | 4 ++-- src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs | 2 +- src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs | 2 +- src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs index 1add34f89..b65b141c6 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 { static class Decoder where T : IInstEmit { - public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, bool isThumb) + public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, bool singleBlock, bool isThumb) { List blocks = []; List branchTargets = []; @@ -24,7 +24,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 blocks.Add(block); - if (block.IsTruncated || !HasNextBlock(block, block.EndAddress - 4UL, branchTargets)) + if (block.IsTruncated || (singleBlock && block.EndsWithBranch) || !HasNextBlock(block, block.EndAddress - 4UL, branchTargets)) { break; } diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs index 383a8d697..f357fea89 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs @@ -227,7 +227,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 public static CompiledFunction Compile(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, IAddressTable funcTable, nint dispatchStubPtr, bool isThumb) { - MultiBlock multiBlock = Decoder.DecodeMulti(cpuPreset, memoryManager, address, isThumb); + MultiBlock multiBlock = Decoder.DecodeMulti(cpuPreset, memoryManager, address, singleBlock: true, isThumb); Dictionary targets = new(); diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs index 6fe075c57..cdad49883 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs @@ -305,7 +305,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 public static CompiledFunction Compile(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, IAddressTable funcTable, nint dispatchStubPtr) { - MultiBlock multiBlock = Decoder.DecodeMulti(cpuPreset, memoryManager, address); + MultiBlock multiBlock = Decoder.DecodeMulti(cpuPreset, memoryManager, address, singleBlock: true); Dictionary targets = new(); List pendingBranches = []; diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs index ad221c7aa..ee47a62ee 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs @@ -13,7 +13,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 private const uint NzcvFlags = 0xfu << 28; private const uint CFlag = 0x1u << 29; - public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address) + public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, bool singleBlock) { List blocks = []; List branchTargets = []; @@ -35,7 +35,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 blocks.Add(block); - if (block.IsTruncated || !HasNextBlock(block, block.EndAddress - 4UL, branchTargets)) + if (block.IsTruncated || (singleBlock && block.EndsWithBranch) || !HasNextBlock(block, block.EndAddress - 4UL, branchTargets)) { break; }