aboutsummaryrefslogtreecommitdiff
path: root/src/ARMJIT.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARMJIT.cpp')
-rw-r--r--src/ARMJIT.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/ARMJIT.cpp b/src/ARMJIT.cpp
index 949bc1c..3b6bc2e 100644
--- a/src/ARMJIT.cpp
+++ b/src/ARMJIT.cpp
@@ -126,6 +126,24 @@ void DeInit()
delete compiler;
}
+void floodFillSetFlags(FetchedInstr instrs[], int start, u8 flags)
+{
+ for (int j = start; j >= 0; j--)
+ {
+ u8 match = instrs[j].Info.WriteFlags & flags;
+ u8 matchMaybe = (instrs[j].Info.WriteFlags >> 4) & flags;
+ if (matchMaybe) // writes flags maybe
+ instrs[j].SetFlags |= matchMaybe;
+ if (match)
+ {
+ instrs[j].SetFlags |= match;
+ flags &= ~match;
+ if (!flags)
+ return;
+ }
+ }
+}
+
CompiledBlock CompileBlock(ARM* cpu)
{
bool thumb = cpu->CPSR & 0x20;
@@ -175,8 +193,14 @@ CompiledBlock CompileBlock(ARM* cpu)
instrs[i].Info = ARMInstrInfo::Decode(thumb, cpu->Num, instrs[i].Instr);
i++;
+
+ bool canCompile = compiler->CanCompile(thumb, instrs[i - 1].Info.Kind);
+ if (instrs[i - 1].Info.ReadFlags != 0 || !canCompile)
+ floodFillSetFlags(instrs, i - 2, canCompile ? instrs[i - 1].Info.ReadFlags : 0xF);
} while(!instrs[i - 1].Info.EndBlock && i < Config::JIT_MaxBlockSize);
+ floodFillSetFlags(instrs, i - 1, 0xF);
+
CompiledBlock block = compiler->CompileBlock(cpu, instrs, i);
if (cpu->Num == 0)