aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Instructions/InstEmitMemoryHelper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/Instructions/InstEmitMemoryHelper.cs')
-rw-r--r--ARMeilleure/Instructions/InstEmitMemoryHelper.cs32
1 files changed, 17 insertions, 15 deletions
diff --git a/ARMeilleure/Instructions/InstEmitMemoryHelper.cs b/ARMeilleure/Instructions/InstEmitMemoryHelper.cs
index e1dec331..b6a4d391 100644
--- a/ARMeilleure/Instructions/InstEmitMemoryHelper.cs
+++ b/ARMeilleure/Instructions/InstEmitMemoryHelper.cs
@@ -1,6 +1,5 @@
using ARMeilleure.Decoders;
using ARMeilleure.IntermediateRepresentation;
-using ARMeilleure.Memory;
using ARMeilleure.Translation;
using System;
@@ -11,6 +10,9 @@ namespace ARMeilleure.Instructions
{
static class InstEmitMemoryHelper
{
+ private const int PageBits = 12;
+ private const int PageMask = (1 << PageBits) - 1;
+
private enum Extension
{
Zx,
@@ -318,28 +320,32 @@ namespace ARMeilleure.Instructions
private static Operand EmitAddressCheck(ArmEmitterContext context, Operand address, int size)
{
- long addressCheckMask = ~(context.Memory.AddressSpaceSize - 1);
+ ulong addressCheckMask = ~((1UL << context.Memory.AddressSpaceBits) - 1);
addressCheckMask |= (1u << size) - 1;
- return context.BitwiseAnd(address, Const(address.Type, addressCheckMask));
+ return context.BitwiseAnd(address, Const(address.Type, (long)addressCheckMask));
}
- private static Operand EmitPtPointerLoad(ArmEmitterContext context, Operand address, Operand lblFallbackPath)
+ private static Operand EmitPtPointerLoad(ArmEmitterContext context, Operand address, Operand lblSlowPath)
{
- Operand pte = Const(context.Memory.PageTable.ToInt64());
+ int ptLevelBits = context.Memory.AddressSpaceBits - 12; // 12 = Number of page bits.
+ int ptLevelSize = 1 << ptLevelBits;
+ int ptLevelMask = ptLevelSize - 1;
+
+ Operand pte = Const(context.Memory.PageTablePointer.ToInt64());
- int bit = MemoryManager.PageBits;
+ int bit = PageBits;
do
{
Operand addrPart = context.ShiftRightUI(address, Const(bit));
- bit += context.Memory.PtLevelBits;
+ bit += ptLevelBits;
if (bit < context.Memory.AddressSpaceBits)
{
- addrPart = context.BitwiseAnd(addrPart, Const(addrPart.Type, context.Memory.PtLevelMask));
+ addrPart = context.BitwiseAnd(addrPart, Const(addrPart.Type, ptLevelMask));
}
Operand pteOffset = context.ShiftLeft(addrPart, Const(3));
@@ -355,20 +361,16 @@ namespace ARMeilleure.Instructions
}
while (bit < context.Memory.AddressSpaceBits);
- Operand hasFlagSet = context.BitwiseAnd(pte, Const((long)MemoryManager.PteFlagsMask));
+ context.BranchIfTrue(lblSlowPath, context.ICompareLess(pte, Const(0L)));
- context.BranchIfTrue(lblFallbackPath, hasFlagSet);
-
- Operand pageOffset = context.BitwiseAnd(address, Const(address.Type, MemoryManager.PageMask));
+ Operand pageOffset = context.BitwiseAnd(address, Const(address.Type, PageMask));
if (pageOffset.Type == OperandType.I32)
{
pageOffset = context.ZeroExtend32(OperandType.I64, pageOffset);
}
- Operand physAddr = context.Add(pte, pageOffset);
-
- return physAddr;
+ return context.Add(pte, pageOffset);
}
private static void EmitReadIntFallback(ArmEmitterContext context, Operand address, int rt, int size)