aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/State
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/State')
-rw-r--r--ARMeilleure/State/ExecutionContext.cs4
-rw-r--r--ARMeilleure/State/FPCR.cs6
-rw-r--r--ARMeilleure/State/FPSR.cs6
-rw-r--r--ARMeilleure/State/FPState.cs15
-rw-r--r--ARMeilleure/State/NativeContext.cs42
-rw-r--r--ARMeilleure/State/RegisterAlias.cs1
-rw-r--r--ARMeilleure/State/RegisterConsts.cs4
7 files changed, 69 insertions, 9 deletions
diff --git a/ARMeilleure/State/ExecutionContext.cs b/ARMeilleure/State/ExecutionContext.cs
index 40676680..482665db 100644
--- a/ARMeilleure/State/ExecutionContext.cs
+++ b/ARMeilleure/State/ExecutionContext.cs
@@ -36,6 +36,7 @@ namespace ARMeilleure.State
public FPCR Fpcr { get; set; }
public FPSR Fpsr { get; set; }
+ public FPCR StandardFpcrValue => (Fpcr & (FPCR.Ahp)) | FPCR.Dn | FPCR.Fz;
public bool IsAarch32 { get; set; }
@@ -90,6 +91,9 @@ namespace ARMeilleure.State
public bool GetPstateFlag(PState flag) => _nativeContext.GetPstateFlag(flag);
public void SetPstateFlag(PState flag, bool value) => _nativeContext.SetPstateFlag(flag, value);
+ public bool GetFPstateFlag(FPState flag) => _nativeContext.GetFPStateFlag(flag);
+ public void SetFPstateFlag(FPState flag, bool value) => _nativeContext.SetFPStateFlag(flag, value);
+
internal void CheckInterrupt()
{
if (_interrupted)
diff --git a/ARMeilleure/State/FPCR.cs b/ARMeilleure/State/FPCR.cs
index 511681fa..913065ea 100644
--- a/ARMeilleure/State/FPCR.cs
+++ b/ARMeilleure/State/FPCR.cs
@@ -3,12 +3,14 @@ using System;
namespace ARMeilleure.State
{
[Flags]
- public enum FPCR
+ public enum FPCR : uint
{
Ufe = 1 << 11,
Fz = 1 << 24,
Dn = 1 << 25,
- Ahp = 1 << 26
+ Ahp = 1 << 26,
+
+ A32Mask = 0x07ffff00
}
public static class FPCRExtensions
diff --git a/ARMeilleure/State/FPSR.cs b/ARMeilleure/State/FPSR.cs
index c20dc439..47323b35 100644
--- a/ARMeilleure/State/FPSR.cs
+++ b/ARMeilleure/State/FPSR.cs
@@ -3,9 +3,11 @@ using System;
namespace ARMeilleure.State
{
[Flags]
- public enum FPSR
+ public enum FPSR : uint
{
Ufc = 1 << 3,
- Qc = 1 << 27
+ Qc = 1 << 27,
+
+ A32Mask = 0xf800000f
}
}
diff --git a/ARMeilleure/State/FPState.cs b/ARMeilleure/State/FPState.cs
new file mode 100644
index 00000000..2fe2a567
--- /dev/null
+++ b/ARMeilleure/State/FPState.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace ARMeilleure.State
+{
+ [Flags]
+ public enum FPState
+ {
+ VFlag = 28,
+ CFlag = 29,
+ ZFlag = 30,
+ NFlag = 31
+ }
+}
diff --git a/ARMeilleure/State/NativeContext.cs b/ARMeilleure/State/NativeContext.cs
index 4e6a5302..eb54505c 100644
--- a/ARMeilleure/State/NativeContext.cs
+++ b/ARMeilleure/State/NativeContext.cs
@@ -14,7 +14,8 @@ namespace ARMeilleure.State
private const int TotalSize = RegisterConsts.IntRegsCount * IntSize +
RegisterConsts.VecRegsCount * VecSize +
- RegisterConsts.FlagsCount * FlagSize + ExtraSize;
+ RegisterConsts.FlagsCount * FlagSize +
+ RegisterConsts.FpFlagsCount * FlagSize + ExtraSize;
public IntPtr BasePtr { get; }
@@ -100,6 +101,38 @@ namespace ARMeilleure.State
Marshal.WriteInt32(BasePtr, offset, value ? 1 : 0);
}
+ public bool GetFPStateFlag(FPState flag)
+ {
+ if ((uint)flag >= RegisterConsts.FlagsCount)
+ {
+ throw new ArgumentException($"Invalid flag \"{flag}\" specified.");
+ }
+
+ int offset =
+ RegisterConsts.IntRegsCount * IntSize +
+ RegisterConsts.VecRegsCount * VecSize +
+ RegisterConsts.FlagsCount * FlagSize + (int)flag * FlagSize;
+
+ int value = Marshal.ReadInt32(BasePtr, offset);
+
+ return value != 0;
+ }
+
+ public void SetFPStateFlag(FPState flag, bool value)
+ {
+ if ((uint)flag >= RegisterConsts.FlagsCount)
+ {
+ throw new ArgumentException($"Invalid flag \"{flag}\" specified.");
+ }
+
+ int offset =
+ RegisterConsts.IntRegsCount * IntSize +
+ RegisterConsts.VecRegsCount * VecSize +
+ RegisterConsts.FlagsCount * FlagSize + (int)flag * FlagSize;
+
+ Marshal.WriteInt32(BasePtr, offset, value ? 1 : 0);
+ }
+
public int GetCounter()
{
return Marshal.ReadInt32(BasePtr, GetCounterOffset());
@@ -144,9 +177,10 @@ namespace ARMeilleure.State
public static int GetCounterOffset()
{
- return RegisterConsts.IntRegsCount * IntSize +
- RegisterConsts.VecRegsCount * VecSize +
- RegisterConsts.FlagsCount * FlagSize;
+ return RegisterConsts.IntRegsCount * IntSize +
+ RegisterConsts.VecRegsCount * VecSize +
+ RegisterConsts.FlagsCount * FlagSize +
+ RegisterConsts.FpFlagsCount * FlagSize;
}
public void Dispose()
diff --git a/ARMeilleure/State/RegisterAlias.cs b/ARMeilleure/State/RegisterAlias.cs
index ae0d4562..7ebfa275 100644
--- a/ARMeilleure/State/RegisterAlias.cs
+++ b/ARMeilleure/State/RegisterAlias.cs
@@ -32,6 +32,7 @@ namespace ARMeilleure.State
public const int SpFiq = 29;
public const int LrFiq = 30;
+ public const int Aarch32Sp = 13;
public const int Aarch32Lr = 14;
public const int Aarch32Pc = 15;
diff --git a/ARMeilleure/State/RegisterConsts.cs b/ARMeilleure/State/RegisterConsts.cs
index a85117bb..d6294080 100644
--- a/ARMeilleure/State/RegisterConsts.cs
+++ b/ARMeilleure/State/RegisterConsts.cs
@@ -5,8 +5,10 @@ namespace ARMeilleure.State
public const int IntRegsCount = 32;
public const int VecRegsCount = 32;
public const int FlagsCount = 32;
+ public const int FpFlagsCount = 32;
public const int IntAndVecRegsCount = IntRegsCount + VecRegsCount;
- public const int TotalCount = IntRegsCount + VecRegsCount + FlagsCount;
+ public const int FpFlagsOffset = IntRegsCount + VecRegsCount + FlagsCount;
+ public const int TotalCount = IntRegsCount + VecRegsCount + FlagsCount + FpFlagsCount;
public const int ZeroIndex = 31;
}