diff --git a/Directory.Packages.props b/Directory.Packages.props
index 7054dcd7d..ab3bc39b8 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -42,7 +42,7 @@
-
+
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs
index 13d9fac68..694633f97 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs
@@ -406,7 +406,7 @@ namespace ARMeilleure.Instructions
{
Operand res = EmitSoftFloatCall(context, nameof(SoftFloat32.FPSub), op1, op2);
- return EmitUnaryMathCall(context, nameof(Math.Abs), res);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Abs), res);
});
}
}
@@ -451,7 +451,7 @@ namespace ARMeilleure.Instructions
{
Operand res = EmitSoftFloatCall(context, nameof(SoftFloat32.FPSub), op1, op2);
- return EmitUnaryMathCall(context, nameof(Math.Abs), res);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Abs), res);
});
}
}
@@ -483,7 +483,7 @@ namespace ARMeilleure.Instructions
{
EmitScalarUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Abs), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1);
});
}
}
@@ -522,7 +522,7 @@ namespace ARMeilleure.Instructions
{
EmitVectorUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Abs), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1);
});
}
}
@@ -2246,7 +2246,7 @@ namespace ARMeilleure.Instructions
{
EmitScalarUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Floor), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1);
});
}
}
@@ -2265,7 +2265,7 @@ namespace ARMeilleure.Instructions
{
EmitVectorUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Floor), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1);
});
}
}
@@ -2322,7 +2322,7 @@ namespace ARMeilleure.Instructions
{
EmitScalarUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Ceiling), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1);
});
}
}
@@ -2341,7 +2341,7 @@ namespace ARMeilleure.Instructions
{
EmitVectorUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Ceiling), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1);
});
}
}
@@ -2390,7 +2390,7 @@ namespace ARMeilleure.Instructions
{
EmitScalarUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Truncate), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1);
});
}
}
@@ -2409,7 +2409,7 @@ namespace ARMeilleure.Instructions
{
EmitVectorUnaryOpF(context, (op1) =>
{
- return EmitUnaryMathCall(context, nameof(Math.Truncate), op1);
+ return EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1);
});
}
}
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
index c807fc858..284f3f576 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
@@ -43,7 +43,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Abs), op1));
+ EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1));
}
}
@@ -66,7 +66,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitVectorUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Abs), op1));
+ EmitVectorUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1));
}
}
else
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs b/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs
index aab677869..8fcb06286 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs
@@ -726,8 +726,8 @@ namespace ARMeilleure.Instructions
if (absolute)
{
- ne = EmitUnaryMathCall(context, nameof(Math.Abs), ne);
- me = EmitUnaryMathCall(context, nameof(Math.Abs), me);
+ ne = EmitUnaryMathCall(context, nameof(MathHelper.Abs), ne);
+ me = EmitUnaryMathCall(context, nameof(MathHelper.Abs), me);
}
Operand e = EmitSoftFloatCall(context, name, ne, me);
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs b/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs
index 3363a7c77..a5d4744f7 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs
@@ -333,7 +333,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1));
+ EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1));
}
}
@@ -349,7 +349,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1), signed: true, scalar: false);
+ EmitFcvt(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1), signed: true, scalar: false);
}
}
@@ -365,7 +365,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1));
+ EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1));
}
}
@@ -538,7 +538,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Ceiling), op1));
+ EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1));
}
}
@@ -554,7 +554,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Ceiling), op1));
+ EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1));
}
}
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs b/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs
index 8eef6b14d..216726df9 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs
@@ -357,10 +357,10 @@ namespace ARMeilleure.Instructions
toConvert = EmitRoundMathCall(context, MidpointRounding.ToEven, toConvert);
break;
case 0b10: // Towards positive infinity
- toConvert = EmitUnaryMathCall(context, nameof(Math.Ceiling), toConvert);
+ toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), toConvert);
break;
case 0b11: // Towards negative infinity
- toConvert = EmitUnaryMathCall(context, nameof(Math.Floor), toConvert);
+ toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Floor), toConvert);
break;
}
@@ -494,10 +494,10 @@ namespace ARMeilleure.Instructions
toConvert = EmitRoundMathCall(context, MidpointRounding.ToEven, toConvert);
break;
case 0b10: // Towards positive infinity
- toConvert = EmitUnaryMathCall(context, nameof(Math.Ceiling), toConvert);
+ toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), toConvert);
break;
case 0b11: // Towards negative infinity
- toConvert = EmitUnaryMathCall(context, nameof(Math.Floor), toConvert);
+ toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Floor), toConvert);
break;
}
@@ -534,7 +534,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Floor), m));
+ EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), m));
}
}
@@ -574,7 +574,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Ceiling), m));
+ EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), m));
}
}
@@ -613,7 +613,7 @@ namespace ARMeilleure.Instructions
}
else
{
- EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Truncate), op1));
+ EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1));
}
}
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs b/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs
index abd0d9acc..634e5c18b 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs
@@ -460,8 +460,8 @@ namespace ARMeilleure.Instructions
IOpCodeSimd op = (IOpCodeSimd)context.CurrOp;
MethodInfo info = (op.Size & 1) == 0
- ? typeof(MathF).GetMethod(name, new Type[] { typeof(float) })
- : typeof(Math).GetMethod(name, new Type[] { typeof(double) });
+ ? typeof(MathHelperF).GetMethod(name, new Type[] { typeof(float) })
+ : typeof(MathHelper).GetMethod(name, new Type[] { typeof(double) });
return context.Call(info, n);
}
@@ -470,11 +470,11 @@ namespace ARMeilleure.Instructions
{
IOpCodeSimd op = (IOpCodeSimd)context.CurrOp;
- string name = nameof(Math.Round);
+ string name = nameof(MathHelper.Round);
MethodInfo info = (op.Size & 1) == 0
- ? typeof(MathF).GetMethod(name, new Type[] { typeof(float), typeof(MidpointRounding) })
- : typeof(Math).GetMethod(name, new Type[] { typeof(double), typeof(MidpointRounding) });
+ ? typeof(MathHelperF).GetMethod(name, new Type[] { typeof(float), typeof(int) })
+ : typeof(MathHelper).GetMethod(name, new Type[] { typeof(double), typeof(int) });
return context.Call(info, n, Const((int)roundMode));
}
@@ -510,16 +510,16 @@ namespace ARMeilleure.Instructions
context.MarkLabel(lbl1);
context.BranchIf(lbl2, rMode, rP, Comparison.NotEqual);
- context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Ceiling), op));
+ context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op));
context.Branch(lblEnd);
context.MarkLabel(lbl2);
context.BranchIf(lbl3, rMode, rM, Comparison.NotEqual);
- context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Floor), op));
+ context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Floor), op));
context.Branch(lblEnd);
context.MarkLabel(lbl3);
- context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Truncate), op));
+ context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op));
context.Branch(lblEnd);
context.MarkLabel(lblEnd);
diff --git a/src/ARMeilleure/Instructions/MathHelper.cs b/src/ARMeilleure/Instructions/MathHelper.cs
new file mode 100644
index 000000000..a11ce9d2e
--- /dev/null
+++ b/src/ARMeilleure/Instructions/MathHelper.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace ARMeilleure.Instructions
+{
+ static class MathHelper
+ {
+ [UnmanagedCallersOnly]
+ public static double Abs(double value)
+ {
+ return Math.Abs(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static double Ceiling(double value)
+ {
+ return Math.Ceiling(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static double Floor(double value)
+ {
+ return Math.Floor(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static double Round(double value, int mode)
+ {
+ return Math.Round(value, (MidpointRounding)mode);
+ }
+
+ [UnmanagedCallersOnly]
+ public static double Truncate(double value)
+ {
+ return Math.Truncate(value);
+ }
+ }
+
+ static class MathHelperF
+ {
+ [UnmanagedCallersOnly]
+ public static float Abs(float value)
+ {
+ return MathF.Abs(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float Ceiling(float value)
+ {
+ return MathF.Ceiling(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float Floor(float value)
+ {
+ return MathF.Floor(value);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float Round(float value, int mode)
+ {
+ return MathF.Round(value, (MidpointRounding)mode);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float Truncate(float value)
+ {
+ return MathF.Truncate(value);
+ }
+ }
+}
diff --git a/src/ARMeilleure/Instructions/NativeInterface.cs b/src/ARMeilleure/Instructions/NativeInterface.cs
index 0cd3754f7..9d6279613 100644
--- a/src/ARMeilleure/Instructions/NativeInterface.cs
+++ b/src/ARMeilleure/Instructions/NativeInterface.cs
@@ -2,6 +2,7 @@ using ARMeilleure.Memory;
using ARMeilleure.State;
using ARMeilleure.Translation;
using System;
+using System.Runtime.InteropServices;
namespace ARMeilleure.Instructions
{
@@ -34,6 +35,7 @@ namespace ARMeilleure.Instructions
Context = null;
}
+ [UnmanagedCallersOnly]
public static void Break(ulong address, int imm)
{
Statistics.PauseTimer();
@@ -43,6 +45,7 @@ namespace ARMeilleure.Instructions
Statistics.ResumeTimer();
}
+ [UnmanagedCallersOnly]
public static void SupervisorCall(ulong address, int imm)
{
Statistics.PauseTimer();
@@ -52,6 +55,7 @@ namespace ARMeilleure.Instructions
Statistics.ResumeTimer();
}
+ [UnmanagedCallersOnly]
public static void Undefined(ulong address, int opCode)
{
Statistics.PauseTimer();
@@ -62,26 +66,31 @@ namespace ARMeilleure.Instructions
}
#region "System registers"
+ [UnmanagedCallersOnly]
public static ulong GetCtrEl0()
{
return GetContext().CtrEl0;
}
+ [UnmanagedCallersOnly]
public static ulong GetDczidEl0()
{
return GetContext().DczidEl0;
}
+ [UnmanagedCallersOnly]
public static ulong GetCntfrqEl0()
{
return GetContext().CntfrqEl0;
}
+ [UnmanagedCallersOnly]
public static ulong GetCntpctEl0()
{
return GetContext().CntpctEl0;
}
+ [UnmanagedCallersOnly]
public static ulong GetCntvctEl0()
{
return GetContext().CntvctEl0;
@@ -89,26 +98,31 @@ namespace ARMeilleure.Instructions
#endregion
#region "Read"
+ [UnmanagedCallersOnly]
public static byte ReadByte(ulong address)
{
return GetMemoryManager().ReadGuest(address);
}
+ [UnmanagedCallersOnly]
public static ushort ReadUInt16(ulong address)
{
return GetMemoryManager().ReadGuest(address);
}
+ [UnmanagedCallersOnly]
public static uint ReadUInt32(ulong address)
{
return GetMemoryManager().ReadGuest(address);
}
+ [UnmanagedCallersOnly]
public static ulong ReadUInt64(ulong address)
{
return GetMemoryManager().ReadGuest(address);
}
+ [UnmanagedCallersOnly]
public static V128 ReadVector128(ulong address)
{
return GetMemoryManager().ReadGuest(address);
@@ -116,47 +130,56 @@ namespace ARMeilleure.Instructions
#endregion
#region "Write"
+ [UnmanagedCallersOnly]
public static void WriteByte(ulong address, byte value)
{
GetMemoryManager().WriteGuest(address, value);
}
+ [UnmanagedCallersOnly]
public static void WriteUInt16(ulong address, ushort value)
{
GetMemoryManager().WriteGuest(address, value);
}
+ [UnmanagedCallersOnly]
public static void WriteUInt32(ulong address, uint value)
{
GetMemoryManager().WriteGuest(address, value);
}
+ [UnmanagedCallersOnly]
public static void WriteUInt64(ulong address, ulong value)
{
GetMemoryManager().WriteGuest(address, value);
}
+ [UnmanagedCallersOnly]
public static void WriteVector128(ulong address, V128 value)
{
GetMemoryManager().WriteGuest(address, value);
}
#endregion
+ [UnmanagedCallersOnly]
public static void EnqueueForRejit(ulong address)
{
Context.Translator.EnqueueForRejit(address, GetContext().ExecutionMode);
}
- public static void SignalMemoryTracking(ulong address, ulong size, bool write)
+ [UnmanagedCallersOnly]
+ public static void SignalMemoryTracking(ulong address, ulong size, byte write)
{
- GetMemoryManager().SignalMemoryTracking(address, size, write);
+ GetMemoryManager().SignalMemoryTracking(address, size, write == 1);
}
+ [UnmanagedCallersOnly]
public static void ThrowInvalidMemoryAccess(ulong address)
{
throw new InvalidAccessException(address);
}
+ [UnmanagedCallersOnly]
public static ulong GetFunctionAddress(ulong address)
{
TranslatedFunction function = Context.Translator.GetOrTranslate(address, GetContext().ExecutionMode);
@@ -164,12 +187,14 @@ namespace ARMeilleure.Instructions
return (ulong)function.FuncPointer.ToInt64();
}
+ [UnmanagedCallersOnly]
public static void InvalidateCacheLine(ulong address)
{
Context.Translator.InvalidateJitCacheRegion(address, InstEmit.DczSizeInBytes);
}
- public static bool CheckSynchronization()
+ [UnmanagedCallersOnly]
+ public static byte CheckSynchronization()
{
Statistics.PauseTimer();
@@ -179,7 +204,7 @@ namespace ARMeilleure.Instructions
Statistics.ResumeTimer();
- return context.Running;
+ return (byte)(context.Running ? 1 : 0);
}
public static ExecutionContext GetContext()
diff --git a/src/ARMeilleure/Instructions/SoftFallback.cs b/src/ARMeilleure/Instructions/SoftFallback.cs
index 899326c4b..178be6f79 100644
--- a/src/ARMeilleure/Instructions/SoftFallback.cs
+++ b/src/ARMeilleure/Instructions/SoftFallback.cs
@@ -1,11 +1,13 @@
using ARMeilleure.State;
using System;
+using System.Runtime.InteropServices;
namespace ARMeilleure.Instructions
{
static class SoftFallback
{
#region "ShrImm64"
+ [UnmanagedCallersOnly]
public static long SignedShrImm64(long value, long roundConst, int shift)
{
if (roundConst == 0L)
@@ -48,6 +50,7 @@ namespace ARMeilleure.Instructions
}
}
+ [UnmanagedCallersOnly]
public static ulong UnsignedShrImm64(ulong value, long roundConst, int shift)
{
if (roundConst == 0L)
@@ -92,6 +95,7 @@ namespace ARMeilleure.Instructions
#endregion
#region "Saturation"
+ [UnmanagedCallersOnly]
public static int SatF32ToS32(float value)
{
if (float.IsNaN(value))
@@ -103,6 +107,7 @@ namespace ARMeilleure.Instructions
value <= int.MinValue ? int.MinValue : (int)value;
}
+ [UnmanagedCallersOnly]
public static long SatF32ToS64(float value)
{
if (float.IsNaN(value))
@@ -114,6 +119,7 @@ namespace ARMeilleure.Instructions
value <= long.MinValue ? long.MinValue : (long)value;
}
+ [UnmanagedCallersOnly]
public static uint SatF32ToU32(float value)
{
if (float.IsNaN(value))
@@ -125,6 +131,7 @@ namespace ARMeilleure.Instructions
value <= uint.MinValue ? uint.MinValue : (uint)value;
}
+ [UnmanagedCallersOnly]
public static ulong SatF32ToU64(float value)
{
if (float.IsNaN(value))
@@ -136,6 +143,7 @@ namespace ARMeilleure.Instructions
value <= ulong.MinValue ? ulong.MinValue : (ulong)value;
}
+ [UnmanagedCallersOnly]
public static int SatF64ToS32(double value)
{
if (double.IsNaN(value))
@@ -147,6 +155,7 @@ namespace ARMeilleure.Instructions
value <= int.MinValue ? int.MinValue : (int)value;
}
+ [UnmanagedCallersOnly]
public static long SatF64ToS64(double value)
{
if (double.IsNaN(value))
@@ -158,6 +167,7 @@ namespace ARMeilleure.Instructions
value <= long.MinValue ? long.MinValue : (long)value;
}
+ [UnmanagedCallersOnly]
public static uint SatF64ToU32(double value)
{
if (double.IsNaN(value))
@@ -169,6 +179,7 @@ namespace ARMeilleure.Instructions
value <= uint.MinValue ? uint.MinValue : (uint)value;
}
+ [UnmanagedCallersOnly]
public static ulong SatF64ToU64(double value)
{
if (double.IsNaN(value))
@@ -182,6 +193,7 @@ namespace ARMeilleure.Instructions
#endregion
#region "Count"
+ [UnmanagedCallersOnly]
public static ulong CountLeadingSigns(ulong value, int size) // size is 8, 16, 32 or 64 (SIMD&FP or Base Inst.).
{
value ^= value >> 1;
@@ -201,6 +213,7 @@ namespace ARMeilleure.Instructions
private static ReadOnlySpan ClzNibbleTbl => new byte[] { 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
+ [UnmanagedCallersOnly]
public static ulong CountLeadingZeros(ulong value, int size) // size is 8, 16, 32 or 64 (SIMD&FP or Base Inst.).
{
if (value == 0ul)
@@ -224,41 +237,49 @@ namespace ARMeilleure.Instructions
#endregion
#region "Table"
+ [UnmanagedCallersOnly]
public static V128 Tbl1(V128 vector, int bytes, V128 tb0)
{
return TblOrTbx(default, vector, bytes, tb0);
}
+ [UnmanagedCallersOnly]
public static V128 Tbl2(V128 vector, int bytes, V128 tb0, V128 tb1)
{
return TblOrTbx(default, vector, bytes, tb0, tb1);
}
+ [UnmanagedCallersOnly]
public static V128 Tbl3(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2)
{
return TblOrTbx(default, vector, bytes, tb0, tb1, tb2);
}
+ [UnmanagedCallersOnly]
public static V128 Tbl4(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3)
{
return TblOrTbx(default, vector, bytes, tb0, tb1, tb2, tb3);
}
+ [UnmanagedCallersOnly]
public static V128 Tbx1(V128 dest, V128 vector, int bytes, V128 tb0)
{
return TblOrTbx(dest, vector, bytes, tb0);
}
+ [UnmanagedCallersOnly]
public static V128 Tbx2(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1)
{
return TblOrTbx(dest, vector, bytes, tb0, tb1);
}
+ [UnmanagedCallersOnly]
public static V128 Tbx3(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2)
{
return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2);
}
+ [UnmanagedCallersOnly]
public static V128 Tbx4(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3)
{
return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2, tb3);
@@ -300,14 +321,22 @@ namespace ARMeilleure.Instructions
private const uint Crc32RevPoly = 0xedb88320;
private const uint Crc32cRevPoly = 0x82f63b78;
+ [UnmanagedCallersOnly]
public static uint Crc32b(uint crc, byte value) => Crc32(crc, Crc32RevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32h(uint crc, ushort value) => Crc32h(crc, Crc32RevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32w(uint crc, uint value) => Crc32w(crc, Crc32RevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32x(uint crc, ulong value) => Crc32x(crc, Crc32RevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32cb(uint crc, byte value) => Crc32(crc, Crc32cRevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32ch(uint crc, ushort value) => Crc32h(crc, Crc32cRevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32cw(uint crc, uint value) => Crc32w(crc, Crc32cRevPoly, value);
+ [UnmanagedCallersOnly]
public static uint Crc32cx(uint crc, ulong value) => Crc32x(crc, Crc32cRevPoly, value);
private static uint Crc32h(uint crc, uint poly, ushort val)
@@ -358,21 +387,25 @@ namespace ARMeilleure.Instructions
#endregion
#region "Aes"
+ [UnmanagedCallersOnly]
public static V128 Decrypt(V128 value, V128 roundKey)
{
return CryptoHelper.AesInvSubBytes(CryptoHelper.AesInvShiftRows(value ^ roundKey));
}
+ [UnmanagedCallersOnly]
public static V128 Encrypt(V128 value, V128 roundKey)
{
return CryptoHelper.AesSubBytes(CryptoHelper.AesShiftRows(value ^ roundKey));
}
+ [UnmanagedCallersOnly]
public static V128 InverseMixColumns(V128 value)
{
return CryptoHelper.AesInvMixColumns(value);
}
+ [UnmanagedCallersOnly]
public static V128 MixColumns(V128 value)
{
return CryptoHelper.AesMixColumns(value);
@@ -380,6 +413,7 @@ namespace ARMeilleure.Instructions
#endregion
#region "Sha1"
+ [UnmanagedCallersOnly]
public static V128 HashChoose(V128 hash_abcd, uint hash_e, V128 wk)
{
for (int e = 0; e <= 3; e++)
@@ -400,11 +434,13 @@ namespace ARMeilleure.Instructions
return hash_abcd;
}
+ [UnmanagedCallersOnly]
public static uint FixedRotate(uint hash_e)
{
return hash_e.Rol(30);
}
+ [UnmanagedCallersOnly]
public static V128 HashMajority(V128 hash_abcd, uint hash_e, V128 wk)
{
for (int e = 0; e <= 3; e++)
@@ -425,6 +461,7 @@ namespace ARMeilleure.Instructions
return hash_abcd;
}
+ [UnmanagedCallersOnly]
public static V128 HashParity(V128 hash_abcd, uint hash_e, V128 wk)
{
for (int e = 0; e <= 3; e++)
@@ -445,6 +482,7 @@ namespace ARMeilleure.Instructions
return hash_abcd;
}
+ [UnmanagedCallersOnly]
public static V128 Sha1SchedulePart1(V128 w0_3, V128 w4_7, V128 w8_11)
{
ulong t2 = w4_7.Extract(0);
@@ -455,6 +493,7 @@ namespace ARMeilleure.Instructions
return result ^ (w0_3 ^ w8_11);
}
+ [UnmanagedCallersOnly]
public static V128 Sha1SchedulePart2(V128 tw0_3, V128 w12_15)
{
V128 t = tw0_3 ^ (w12_15 >> 32);
@@ -499,16 +538,19 @@ namespace ARMeilleure.Instructions
#endregion
#region "Sha256"
+ [UnmanagedCallersOnly]
public static V128 HashLower(V128 hash_abcd, V128 hash_efgh, V128 wk)
{
return Sha256Hash(hash_abcd, hash_efgh, wk, part1: true);
}
+ [UnmanagedCallersOnly]
public static V128 HashUpper(V128 hash_abcd, V128 hash_efgh, V128 wk)
{
return Sha256Hash(hash_abcd, hash_efgh, wk, part1: false);
}
+ [UnmanagedCallersOnly]
public static V128 Sha256SchedulePart1(V128 w0_3, V128 w4_7)
{
V128 result = new();
@@ -527,6 +569,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static V128 Sha256SchedulePart2(V128 w0_3, V128 w8_11, V128 w12_15)
{
V128 result = new();
@@ -628,6 +671,7 @@ namespace ARMeilleure.Instructions
}
#endregion
+ [UnmanagedCallersOnly]
public static V128 PolynomialMult64_128(ulong op1, ulong op2)
{
V128 result = V128.Zero;
diff --git a/src/ARMeilleure/Instructions/SoftFloat.cs b/src/ARMeilleure/Instructions/SoftFloat.cs
index a67349e6e..7895ca1dc 100644
--- a/src/ARMeilleure/Instructions/SoftFloat.cs
+++ b/src/ARMeilleure/Instructions/SoftFloat.cs
@@ -1,6 +1,7 @@
using ARMeilleure.State;
using System;
using System.Diagnostics;
+using System.Runtime.InteropServices;
namespace ARMeilleure.Instructions
{
@@ -312,6 +313,7 @@ namespace ARMeilleure.Instructions
static class SoftFloat16_32
{
+ [UnmanagedCallersOnly]
public static float FPConvert(ushort valueBits)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -487,6 +489,7 @@ namespace ARMeilleure.Instructions
static class SoftFloat16_64
{
+ [UnmanagedCallersOnly]
public static double FPConvert(ushort valueBits)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -662,6 +665,7 @@ namespace ARMeilleure.Instructions
static class SoftFloat32_16
{
+ [UnmanagedCallersOnly]
public static ushort FPConvert(float value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -781,12 +785,19 @@ namespace ARMeilleure.Instructions
static class SoftFloat32
{
+ [UnmanagedCallersOnly]
public static float FPAdd(float value1, float value2)
{
- return FPAddFpscr(value1, value2, false);
+ return FPAddFpscrImpl(value1, value2, false);
}
- public static float FPAddFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPAddFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPAddFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPAddFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -837,7 +848,8 @@ namespace ARMeilleure.Instructions
return result;
}
- public static int FPCompare(float value1, float value2, bool signalNaNs)
+ [UnmanagedCallersOnly]
+ public static int FPCompare(float value1, float value2, byte signalNaNs)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = context.Fpcr;
@@ -851,7 +863,7 @@ namespace ARMeilleure.Instructions
{
result = 0b0011;
- if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs)
+ if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs == 1)
{
SoftFloat.FPProcessException(FPException.InvalidOp, context, fpcr);
}
@@ -875,12 +887,13 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPCompareEQ(float value1, float value2)
{
- return FPCompareEQFpscr(value1, value2, false);
+ return FPCompareEQFpscrImpl(value1, value2, false);
}
- public static float FPCompareEQFpscr(float value1, float value2, bool standardFpscr)
+ private static float FPCompareEQFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -907,12 +920,25 @@ namespace ARMeilleure.Instructions
return result;
}
- public static float FPCompareGE(float value1, float value2)
+ [UnmanagedCallersOnly]
+ public static float FPCompareEQFpscr(float value1, float value2, byte standardFpscr)
{
- return FPCompareGEFpscr(value1, value2, false);
+ return FPCompareEQFpscrImpl(value1, value2, standardFpscr == 1);
}
- public static float FPCompareGEFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPCompareGE(float value1, float value2)
+ {
+ return FPCompareGEFpscrImpl(value1, value2, false);
+ }
+
+ [UnmanagedCallersOnly]
+ public static float FPCompareGEFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPCompareGEFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPCompareGEFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -936,12 +962,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPCompareGT(float value1, float value2)
{
- return FPCompareGTFpscr(value1, value2, false);
+ return FPCompareGTFpscrImpl(value1, value2, false);
}
- public static float FPCompareGTFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPCompareGTFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPCompareGTFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPCompareGTFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -965,26 +998,31 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPCompareLE(float value1, float value2)
{
- return FPCompareGE(value2, value1);
+ return FPCompareGEFpscrImpl(value2, value1, false);
}
+ [UnmanagedCallersOnly]
public static float FPCompareLT(float value1, float value2)
{
- return FPCompareGT(value2, value1);
+ return FPCompareGTFpscrImpl(value2, value1, false);
}
- public static float FPCompareLEFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPCompareLEFpscr(float value1, float value2, byte standardFpscr)
{
- return FPCompareGEFpscr(value2, value1, standardFpscr);
+ return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1);
}
- public static float FPCompareLTFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPCompareLTFpscr(float value1, float value2, byte standardFpscr)
{
- return FPCompareGTFpscr(value2, value1, standardFpscr);
+ return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1);
}
+ [UnmanagedCallersOnly]
public static float FPDiv(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1037,12 +1075,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMax(float value1, float value2)
{
- return FPMaxFpscr(value1, value2, false);
+ return FPMaxFpscrImpl(value1, value2, false);
}
- public static float FPMaxFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMaxFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMaxFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMaxFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1103,12 +1148,13 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMaxNum(float value1, float value2)
{
- return FPMaxNumFpscr(value1, value2, false);
+ return FPMaxNumFpscrImpl(value1, value2, false);
}
- public static float FPMaxNumFpscr(float value1, float value2, bool standardFpscr)
+ private static float FPMaxNumFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1125,15 +1171,28 @@ namespace ARMeilleure.Instructions
value2 = FPInfinity(true);
}
- return FPMaxFpscr(value1, value2, standardFpscr);
+ return FPMaxFpscrImpl(value1, value2, standardFpscr);
}
+ [UnmanagedCallersOnly]
+ public static float FPMaxNumFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMaxNumFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ [UnmanagedCallersOnly]
public static float FPMin(float value1, float value2)
{
- return FPMinFpscr(value1, value2, false);
+ return FPMinFpscrImpl(value1, value2, false);
}
- public static float FPMinFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMinFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMinFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMinFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1194,12 +1253,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMinNum(float value1, float value2)
{
- return FPMinNumFpscr(value1, value2, false);
+ return FPMinNumFpscrImpl(value1, value2, false);
}
- public static float FPMinNumFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMinNumFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMinNumFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMinNumFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1216,15 +1282,22 @@ namespace ARMeilleure.Instructions
value2 = FPInfinity(false);
}
- return FPMinFpscr(value1, value2, standardFpscr);
+ return FPMinFpscrImpl(value1, value2, standardFpscr);
}
+ [UnmanagedCallersOnly]
public static float FPMul(float value1, float value2)
{
- return FPMulFpscr(value1, value2, false);
+ return FPMulFpscrImpl(value1, value2, false);
}
- public static float FPMulFpscr(float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMulFpscr(float value1, float value2, byte standardFpscr)
+ {
+ return FPMulFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMulFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1271,12 +1344,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMulAdd(float valueA, float value1, float value2)
{
- return FPMulAddFpscr(valueA, value1, value2, false);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
- public static float FPMulAddFpscr(float valueA, float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMulAddFpscr(float valueA, float value1, float value2, byte standardFpscr)
+ {
+ return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1);
+ }
+
+ private static float FPMulAddFpscrImpl(float valueA, float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1342,20 +1422,23 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPMulSub(float valueA, float value1, float value2)
{
value1 = value1.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
- public static float FPMulSubFpscr(float valueA, float value1, float value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPMulSubFpscr(float valueA, float value1, float value2, byte standardFpscr)
{
value1 = value1.FPNeg();
- return FPMulAddFpscr(valueA, value1, value2, standardFpscr);
+ return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1);
}
+ [UnmanagedCallersOnly]
public static float FPMulX(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1401,27 +1484,36 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPNegMulAdd(float valueA, float value1, float value2)
{
valueA = valueA.FPNeg();
value1 = value1.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
+ [UnmanagedCallersOnly]
public static float FPNegMulSub(float valueA, float value1, float value2)
{
valueA = valueA.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
+ [UnmanagedCallersOnly]
public static float FPRecipEstimate(float value)
{
- return FPRecipEstimateFpscr(value, false);
+ return FPRecipEstimateFpscrImpl(value, false);
}
- public static float FPRecipEstimateFpscr(float value, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPRecipEstimateFpscr(float value, byte standardFpscr)
+ {
+ return FPRecipEstimateFpscrImpl(value, standardFpscr == 1);
+ }
+
+ private static float FPRecipEstimateFpscrImpl(float value, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1508,6 +1600,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRecipStep(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1533,15 +1626,16 @@ namespace ARMeilleure.Instructions
}
else
{
- product = FPMulFpscr(value1, value2, true);
+ product = FPMulFpscrImpl(value1, value2, true);
}
- result = FPSubFpscr(FPTwo(false), product, true);
+ result = FPSubFpscrImpl(FPTwo(false), product, true);
}
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRecipStepFused(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1585,6 +1679,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRecpX(float value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1610,12 +1705,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRSqrtEstimate(float value)
{
- return FPRSqrtEstimateFpscr(value, false);
+ return FPRSqrtEstimateFpscrImpl(value, false);
}
- public static float FPRSqrtEstimateFpscr(float value, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static float FPRSqrtEstimateFpscr(float value, byte standardFpscr)
+ {
+ return FPRSqrtEstimateFpscrImpl(value, standardFpscr == 1);
+ }
+
+ private static float FPRSqrtEstimateFpscrImpl(float value, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -1729,6 +1831,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRSqrtStep(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1754,7 +1857,7 @@ namespace ARMeilleure.Instructions
}
else
{
- product = FPMulFpscr(value1, value2, true);
+ product = FPMulFpscrImpl(value1, value2, true);
}
result = FPHalvedSub(FPThree(false), product, context, fpcr);
@@ -1763,6 +1866,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPRSqrtStepFused(float value1, float value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1806,6 +1910,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPSqrt(float value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -1848,12 +1953,13 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static float FPSub(float value1, float value2)
{
- return FPSubFpscr(value1, value2, false);
+ return FPSubFpscrImpl(value1, value2, false);
}
- public static float FPSubFpscr(float value1, float value2, bool standardFpscr)
+ private static float FPSubFpscrImpl(float value1, float value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2094,6 +2200,7 @@ namespace ARMeilleure.Instructions
static class SoftFloat64_16
{
+ [UnmanagedCallersOnly]
public static ushort FPConvert(double value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -2213,12 +2320,19 @@ namespace ARMeilleure.Instructions
static class SoftFloat64
{
+ [UnmanagedCallersOnly]
public static double FPAdd(double value1, double value2)
{
- return FPAddFpscr(value1, value2, false);
+ return FPAddFpscrImpl(value1, value2, false);
}
- public static double FPAddFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPAddFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPAddFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPAddFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2269,7 +2383,8 @@ namespace ARMeilleure.Instructions
return result;
}
- public static int FPCompare(double value1, double value2, bool signalNaNs)
+ [UnmanagedCallersOnly]
+ public static int FPCompare(double value1, double value2, byte signalNaNs)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = context.Fpcr;
@@ -2283,7 +2398,7 @@ namespace ARMeilleure.Instructions
{
result = 0b0011;
- if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs)
+ if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs == 1)
{
SoftFloat.FPProcessException(FPException.InvalidOp, context, fpcr);
}
@@ -2307,12 +2422,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPCompareEQ(double value1, double value2)
{
- return FPCompareEQFpscr(value1, value2, false);
+ return FPCompareEQFpscrImpl(value1, value2, false);
}
- public static double FPCompareEQFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareEQFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPCompareEQFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPCompareEQFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2339,12 +2461,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPCompareGE(double value1, double value2)
{
- return FPCompareGEFpscr(value1, value2, false);
+ return FPCompareGEFpscrImpl(value1, value2, false);
}
- public static double FPCompareGEFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareGEFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPCompareGEFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPCompareGEFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2368,12 +2497,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPCompareGT(double value1, double value2)
{
- return FPCompareGTFpscr(value1, value2, false);
+ return FPCompareGTFpscrImpl(value1, value2, false);
}
- public static double FPCompareGTFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareGTFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPCompareGTFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPCompareGTFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2397,26 +2533,31 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPCompareLE(double value1, double value2)
{
- return FPCompareGE(value2, value1);
+ return FPCompareGEFpscrImpl(value2, value1, false);
}
+ [UnmanagedCallersOnly]
public static double FPCompareLT(double value1, double value2)
{
- return FPCompareGT(value2, value1);
+ return FPCompareGTFpscrImpl(value2, value1, false);
}
- public static double FPCompareLEFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareLEFpscr(double value1, double value2, byte standardFpscr)
{
- return FPCompareGEFpscr(value2, value1, standardFpscr);
+ return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1);
}
- public static double FPCompareLTFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPCompareLTFpscr(double value1, double value2, byte standardFpscr)
{
- return FPCompareGTFpscr(value2, value1, standardFpscr);
+ return FPCompareGTFpscrImpl(value2, value1, standardFpscr == 1);
}
+ [UnmanagedCallersOnly]
public static double FPDiv(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -2469,12 +2610,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMax(double value1, double value2)
{
- return FPMaxFpscr(value1, value2, false);
+ return FPMaxFpscrImpl(value1, value2, false);
}
- public static double FPMaxFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMaxFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMaxFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMaxFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2535,12 +2683,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMaxNum(double value1, double value2)
{
- return FPMaxNumFpscr(value1, value2, false);
+ return FPMaxNumFpscrImpl(value1, value2, false);
}
- public static double FPMaxNumFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMaxNumFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMaxNumFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMaxNumFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2557,15 +2712,22 @@ namespace ARMeilleure.Instructions
value2 = FPInfinity(true);
}
- return FPMaxFpscr(value1, value2, standardFpscr);
+ return FPMaxFpscrImpl(value1, value2, standardFpscr);
}
+ [UnmanagedCallersOnly]
public static double FPMin(double value1, double value2)
{
- return FPMinFpscr(value1, value2, false);
+ return FPMinFpscrImpl(value1, value2, false);
}
- public static double FPMinFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMinFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMinFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMinFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2626,12 +2788,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMinNum(double value1, double value2)
{
- return FPMinNumFpscr(value1, value2, false);
+ return FPMinNumFpscrImpl(value1, value2, false);
}
- public static double FPMinNumFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMinNumFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMinNumFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMinNumFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2648,15 +2817,22 @@ namespace ARMeilleure.Instructions
value2 = FPInfinity(false);
}
- return FPMinFpscr(value1, value2, standardFpscr);
+ return FPMinFpscrImpl(value1, value2, standardFpscr);
}
+ [UnmanagedCallersOnly]
public static double FPMul(double value1, double value2)
{
- return FPMulFpscr(value1, value2, false);
+ return FPMulFpscrImpl(value1, value2, false);
}
- public static double FPMulFpscr(double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMulFpscr(double value1, double value2, byte standardFpscr)
+ {
+ return FPMulFpscrImpl(value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMulFpscrImpl(double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2703,12 +2879,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMulAdd(double valueA, double value1, double value2)
{
- return FPMulAddFpscr(valueA, value1, value2, false);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
- public static double FPMulAddFpscr(double valueA, double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMulAddFpscr(double valueA, double value1, double value2, byte standardFpscr)
+ {
+ return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1);
+ }
+
+ private static double FPMulAddFpscrImpl(double valueA, double value1, double value2, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2774,20 +2957,23 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPMulSub(double valueA, double value1, double value2)
{
value1 = value1.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
- public static double FPMulSubFpscr(double valueA, double value1, double value2, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPMulSubFpscr(double valueA, double value1, double value2, byte standardFpscr)
{
value1 = value1.FPNeg();
- return FPMulAddFpscr(valueA, value1, value2, standardFpscr);
+ return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1);
}
+ [UnmanagedCallersOnly]
public static double FPMulX(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -2833,27 +3019,36 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPNegMulAdd(double valueA, double value1, double value2)
{
valueA = valueA.FPNeg();
value1 = value1.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
+ [UnmanagedCallersOnly]
public static double FPNegMulSub(double valueA, double value1, double value2)
{
valueA = valueA.FPNeg();
- return FPMulAdd(valueA, value1, value2);
+ return FPMulAddFpscrImpl(valueA, value1, value2, false);
}
+ [UnmanagedCallersOnly]
public static double FPRecipEstimate(double value)
{
- return FPRecipEstimateFpscr(value, false);
+ return FPRecipEstimateFpscrImpl(value, false);
}
- public static double FPRecipEstimateFpscr(double value, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPRecipEstimateFpscr(double value, byte standardFpscr)
+ {
+ return FPRecipEstimateFpscrImpl(value, standardFpscr == 1);
+ }
+
+ private static double FPRecipEstimateFpscrImpl(double value, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -2940,6 +3135,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRecipStep(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -2965,7 +3161,7 @@ namespace ARMeilleure.Instructions
}
else
{
- product = FPMulFpscr(value1, value2, true);
+ product = FPMulFpscrImpl(value1, value2, true);
}
result = FPSubFpscr(FPTwo(false), product, true);
@@ -2974,6 +3170,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRecipStepFused(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3017,6 +3214,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRecpX(double value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3042,12 +3240,19 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRSqrtEstimate(double value)
{
- return FPRSqrtEstimateFpscr(value, false);
+ return FPRSqrtEstimateFpscrImpl(value, false);
}
- public static double FPRSqrtEstimateFpscr(double value, bool standardFpscr)
+ [UnmanagedCallersOnly]
+ public static double FPRSqrtEstimateFpscr(double value, byte standardFpscr)
+ {
+ return FPRSqrtEstimateFpscrImpl(value, standardFpscr == 1);
+ }
+
+ private static double FPRSqrtEstimateFpscrImpl(double value, bool standardFpscr)
{
ExecutionContext context = NativeInterface.GetContext();
FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr;
@@ -3161,6 +3366,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRSqrtStep(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3186,7 +3392,7 @@ namespace ARMeilleure.Instructions
}
else
{
- product = FPMulFpscr(value1, value2, true);
+ product = FPMulFpscrImpl(value1, value2, true);
}
result = FPHalvedSub(FPThree(false), product, context, fpcr);
@@ -3195,6 +3401,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPRSqrtStepFused(double value1, double value2)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3238,6 +3445,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPSqrt(double value)
{
ExecutionContext context = NativeInterface.GetContext();
@@ -3280,6 +3488,7 @@ namespace ARMeilleure.Instructions
return result;
}
+ [UnmanagedCallersOnly]
public static double FPSub(double value1, double value2)
{
return FPSubFpscr(value1, value2, false);
diff --git a/src/ARMeilleure/Translation/DelegateInfo.cs b/src/ARMeilleure/Translation/DelegateInfo.cs
index d3b535de1..64ee7bc9c 100644
--- a/src/ARMeilleure/Translation/DelegateInfo.cs
+++ b/src/ARMeilleure/Translation/DelegateInfo.cs
@@ -4,15 +4,9 @@ namespace ARMeilleure.Translation
{
class DelegateInfo
{
-#pragma warning disable IDE0052 // Remove unread private member
- private readonly Delegate _dlg; // Ensure that this delegate will not be garbage collected.
-#pragma warning restore IDE0052
-
- public nint FuncPtr { get; }
-
- public DelegateInfo(Delegate dlg, nint funcPtr)
+ public nint FuncPtr { get; private set; }
+ public DelegateInfo(nint funcPtr)
{
- _dlg = dlg;
FuncPtr = funcPtr;
}
}
diff --git a/src/ARMeilleure/Translation/Delegates.cs b/src/ARMeilleure/Translation/Delegates.cs
index d8c1cfd58..d4f46108c 100644
--- a/src/ARMeilleure/Translation/Delegates.cs
+++ b/src/ARMeilleure/Translation/Delegates.cs
@@ -1,9 +1,7 @@
using ARMeilleure.Instructions;
-using ARMeilleure.State;
using System;
using System.Collections.Generic;
using System.Reflection;
-using System.Runtime.InteropServices;
namespace ARMeilleure.Translation
{
@@ -34,21 +32,7 @@ namespace ARMeilleure.Translation
return _delegates.Values[index].FuncPtr; // O(1).
}
-
- public static nint GetDelegateFuncPtr(MethodInfo info)
- {
- ArgumentNullException.ThrowIfNull(info);
-
- string key = GetKey(info);
-
- if (!_delegates.TryGetValue(key, out DelegateInfo dlgInfo)) // O(log(n)).
- {
- throw new KeyNotFoundException($"({nameof(key)} = {key})");
- }
-
- return dlgInfo.FuncPtr;
- }
-
+
public static int GetDelegateIndex(MethodInfo info)
{
ArgumentNullException.ThrowIfNull(info);
@@ -64,12 +48,12 @@ namespace ARMeilleure.Translation
return index;
}
-
- private static void SetDelegateInfo(Delegate dlg, nint funcPtr)
+
+ private static void SetDelegateInfo(MethodInfo method)
{
- string key = GetKey(dlg.Method);
+ string key = GetKey(method);
- _delegates.Add(key, new DelegateInfo(dlg, funcPtr)); // ArgumentException (key).
+ _delegates.Add(key, new DelegateInfo(method.MethodHandle.GetFunctionPointer())); // ArgumentException (key).
}
private static string GetKey(MethodInfo info)
@@ -83,528 +67,179 @@ namespace ARMeilleure.Translation
{
_delegates = new SortedList();
- var dlgMathAbs = new MathAbs(Math.Abs);
- var dlgMathCeiling = new MathCeiling(Math.Ceiling);
- var dlgMathFloor = new MathFloor(Math.Floor);
- var dlgMathRound = new MathRound(Math.Round);
- var dlgMathTruncate = new MathTruncate(Math.Truncate);
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Abs)));
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Ceiling)));
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Floor)));
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Round)));
+ SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Truncate)));
- var dlgMathFAbs = new MathFAbs(MathF.Abs);
- var dlgMathFCeiling = new MathFCeiling(MathF.Ceiling);
- var dlgMathFFloor = new MathFFloor(MathF.Floor);
- var dlgMathFRound = new MathFRound(MathF.Round);
- var dlgMathFTruncate = new MathFTruncate(MathF.Truncate);
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Abs)));
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Ceiling)));
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Floor)));
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Round)));
+ SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Truncate)));
- var dlgNativeInterfaceBreak = new NativeInterfaceBreak(NativeInterface.Break);
- var dlgNativeInterfaceCheckSynchronization = new NativeInterfaceCheckSynchronization(NativeInterface.CheckSynchronization);
- var dlgNativeInterfaceEnqueueForRejit = new NativeInterfaceEnqueueForRejit(NativeInterface.EnqueueForRejit);
- var dlgNativeInterfaceGetCntfrqEl0 = new NativeInterfaceGetCntfrqEl0(NativeInterface.GetCntfrqEl0);
- var dlgNativeInterfaceGetCntpctEl0 = new NativeInterfaceGetCntpctEl0(NativeInterface.GetCntpctEl0);
- var dlgNativeInterfaceGetCntvctEl0 = new NativeInterfaceGetCntvctEl0(NativeInterface.GetCntvctEl0);
- var dlgNativeInterfaceGetCtrEl0 = new NativeInterfaceGetCtrEl0(NativeInterface.GetCtrEl0);
- var dlgNativeInterfaceGetDczidEl0 = new NativeInterfaceGetDczidEl0(NativeInterface.GetDczidEl0);
- var dlgNativeInterfaceGetFunctionAddress = new NativeInterfaceGetFunctionAddress(NativeInterface.GetFunctionAddress);
- var dlgNativeInterfaceInvalidateCacheLine = new NativeInterfaceInvalidateCacheLine(NativeInterface.InvalidateCacheLine);
- var dlgNativeInterfaceReadByte = new NativeInterfaceReadByte(NativeInterface.ReadByte);
- var dlgNativeInterfaceReadUInt16 = new NativeInterfaceReadUInt16(NativeInterface.ReadUInt16);
- var dlgNativeInterfaceReadUInt32 = new NativeInterfaceReadUInt32(NativeInterface.ReadUInt32);
- var dlgNativeInterfaceReadUInt64 = new NativeInterfaceReadUInt64(NativeInterface.ReadUInt64);
- var dlgNativeInterfaceReadVector128 = new NativeInterfaceReadVector128(NativeInterface.ReadVector128);
- var dlgNativeInterfaceSignalMemoryTracking = new NativeInterfaceSignalMemoryTracking(NativeInterface.SignalMemoryTracking);
- var dlgNativeInterfaceSupervisorCall = new NativeInterfaceSupervisorCall(NativeInterface.SupervisorCall);
- var dlgNativeInterfaceThrowInvalidMemoryAccess = new NativeInterfaceThrowInvalidMemoryAccess(NativeInterface.ThrowInvalidMemoryAccess);
- var dlgNativeInterfaceUndefined = new NativeInterfaceUndefined(NativeInterface.Undefined);
- var dlgNativeInterfaceWriteByte = new NativeInterfaceWriteByte(NativeInterface.WriteByte);
- var dlgNativeInterfaceWriteUInt16 = new NativeInterfaceWriteUInt16(NativeInterface.WriteUInt16);
- var dlgNativeInterfaceWriteUInt32 = new NativeInterfaceWriteUInt32(NativeInterface.WriteUInt32);
- var dlgNativeInterfaceWriteUInt64 = new NativeInterfaceWriteUInt64(NativeInterface.WriteUInt64);
- var dlgNativeInterfaceWriteVector128 = new NativeInterfaceWriteVector128(NativeInterface.WriteVector128);
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Break)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.CheckSynchronization)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.EnqueueForRejit)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntfrqEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntpctEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntvctEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCtrEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetDczidEl0)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFunctionAddress)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.InvalidateCacheLine)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByte)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SignalMemoryTracking)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SupervisorCall)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ThrowInvalidMemoryAccess)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Undefined)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByte)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64)));
+ SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128)));
- var dlgSoftFallbackCountLeadingSigns = new SoftFallbackCountLeadingSigns(SoftFallback.CountLeadingSigns);
- var dlgSoftFallbackCountLeadingZeros = new SoftFallbackCountLeadingZeros(SoftFallback.CountLeadingZeros);
- var dlgSoftFallbackCrc32b = new SoftFallbackCrc32b(SoftFallback.Crc32b);
- var dlgSoftFallbackCrc32cb = new SoftFallbackCrc32cb(SoftFallback.Crc32cb);
- var dlgSoftFallbackCrc32ch = new SoftFallbackCrc32ch(SoftFallback.Crc32ch);
- var dlgSoftFallbackCrc32cw = new SoftFallbackCrc32cw(SoftFallback.Crc32cw);
- var dlgSoftFallbackCrc32cx = new SoftFallbackCrc32cx(SoftFallback.Crc32cx);
- var dlgSoftFallbackCrc32h = new SoftFallbackCrc32h(SoftFallback.Crc32h);
- var dlgSoftFallbackCrc32w = new SoftFallbackCrc32w(SoftFallback.Crc32w);
- var dlgSoftFallbackCrc32x = new SoftFallbackCrc32x(SoftFallback.Crc32x);
- var dlgSoftFallbackDecrypt = new SoftFallbackDecrypt(SoftFallback.Decrypt);
- var dlgSoftFallbackEncrypt = new SoftFallbackEncrypt(SoftFallback.Encrypt);
- var dlgSoftFallbackFixedRotate = new SoftFallbackFixedRotate(SoftFallback.FixedRotate);
- var dlgSoftFallbackHashChoose = new SoftFallbackHashChoose(SoftFallback.HashChoose);
- var dlgSoftFallbackHashLower = new SoftFallbackHashLower(SoftFallback.HashLower);
- var dlgSoftFallbackHashMajority = new SoftFallbackHashMajority(SoftFallback.HashMajority);
- var dlgSoftFallbackHashParity = new SoftFallbackHashParity(SoftFallback.HashParity);
- var dlgSoftFallbackHashUpper = new SoftFallbackHashUpper(SoftFallback.HashUpper);
- var dlgSoftFallbackInverseMixColumns = new SoftFallbackInverseMixColumns(SoftFallback.InverseMixColumns);
- var dlgSoftFallbackMixColumns = new SoftFallbackMixColumns(SoftFallback.MixColumns);
- var dlgSoftFallbackPolynomialMult64_128 = new SoftFallbackPolynomialMult64_128(SoftFallback.PolynomialMult64_128);
- var dlgSoftFallbackSatF32ToS32 = new SoftFallbackSatF32ToS32(SoftFallback.SatF32ToS32);
- var dlgSoftFallbackSatF32ToS64 = new SoftFallbackSatF32ToS64(SoftFallback.SatF32ToS64);
- var dlgSoftFallbackSatF32ToU32 = new SoftFallbackSatF32ToU32(SoftFallback.SatF32ToU32);
- var dlgSoftFallbackSatF32ToU64 = new SoftFallbackSatF32ToU64(SoftFallback.SatF32ToU64);
- var dlgSoftFallbackSatF64ToS32 = new SoftFallbackSatF64ToS32(SoftFallback.SatF64ToS32);
- var dlgSoftFallbackSatF64ToS64 = new SoftFallbackSatF64ToS64(SoftFallback.SatF64ToS64);
- var dlgSoftFallbackSatF64ToU32 = new SoftFallbackSatF64ToU32(SoftFallback.SatF64ToU32);
- var dlgSoftFallbackSatF64ToU64 = new SoftFallbackSatF64ToU64(SoftFallback.SatF64ToU64);
- var dlgSoftFallbackSha1SchedulePart1 = new SoftFallbackSha1SchedulePart1(SoftFallback.Sha1SchedulePart1);
- var dlgSoftFallbackSha1SchedulePart2 = new SoftFallbackSha1SchedulePart2(SoftFallback.Sha1SchedulePart2);
- var dlgSoftFallbackSha256SchedulePart1 = new SoftFallbackSha256SchedulePart1(SoftFallback.Sha256SchedulePart1);
- var dlgSoftFallbackSha256SchedulePart2 = new SoftFallbackSha256SchedulePart2(SoftFallback.Sha256SchedulePart2);
- var dlgSoftFallbackSignedShrImm64 = new SoftFallbackSignedShrImm64(SoftFallback.SignedShrImm64);
- var dlgSoftFallbackTbl1 = new SoftFallbackTbl1(SoftFallback.Tbl1);
- var dlgSoftFallbackTbl2 = new SoftFallbackTbl2(SoftFallback.Tbl2);
- var dlgSoftFallbackTbl3 = new SoftFallbackTbl3(SoftFallback.Tbl3);
- var dlgSoftFallbackTbl4 = new SoftFallbackTbl4(SoftFallback.Tbl4);
- var dlgSoftFallbackTbx1 = new SoftFallbackTbx1(SoftFallback.Tbx1);
- var dlgSoftFallbackTbx2 = new SoftFallbackTbx2(SoftFallback.Tbx2);
- var dlgSoftFallbackTbx3 = new SoftFallbackTbx3(SoftFallback.Tbx3);
- var dlgSoftFallbackTbx4 = new SoftFallbackTbx4(SoftFallback.Tbx4);
- var dlgSoftFallbackUnsignedShrImm64 = new SoftFallbackUnsignedShrImm64(SoftFallback.UnsignedShrImm64);
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingSigns)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingZeros)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32b)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cb)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32ch)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cw)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cx)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32h)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32w)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32x)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Decrypt)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Encrypt)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.FixedRotate)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashChoose)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashLower)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashMajority)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashParity)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashUpper)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.InverseMixColumns)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.MixColumns)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.PolynomialMult64_128)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS32)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU32)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart1)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart2)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart1)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart2)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShrImm64)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl1)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl2)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl3)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl4)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx1)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx2)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx3)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx4)));
+ SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShrImm64)));
- var dlgSoftFloat16_32FPConvert = new SoftFloat16_32FPConvert(SoftFloat16_32.FPConvert);
- var dlgSoftFloat16_64FPConvert = new SoftFloat16_64FPConvert(SoftFloat16_64.FPConvert);
+ SetDelegateInfo(typeof(SoftFloat16_32).GetMethod(nameof(SoftFloat16_32.FPConvert)));
+ SetDelegateInfo(typeof(SoftFloat16_64).GetMethod(nameof(SoftFloat16_64.FPConvert)));
- var dlgSoftFloat32FPAdd = new SoftFloat32FPAdd(SoftFloat32.FPAdd);
- var dlgSoftFloat32FPAddFpscr = new SoftFloat32FPAddFpscr(SoftFloat32.FPAddFpscr); // A32 only.
- var dlgSoftFloat32FPCompare = new SoftFloat32FPCompare(SoftFloat32.FPCompare);
- var dlgSoftFloat32FPCompareEQ = new SoftFloat32FPCompareEQ(SoftFloat32.FPCompareEQ);
- var dlgSoftFloat32FPCompareEQFpscr = new SoftFloat32FPCompareEQFpscr(SoftFloat32.FPCompareEQFpscr); // A32 only.
- var dlgSoftFloat32FPCompareGE = new SoftFloat32FPCompareGE(SoftFloat32.FPCompareGE);
- var dlgSoftFloat32FPCompareGEFpscr = new SoftFloat32FPCompareGEFpscr(SoftFloat32.FPCompareGEFpscr); // A32 only.
- var dlgSoftFloat32FPCompareGT = new SoftFloat32FPCompareGT(SoftFloat32.FPCompareGT);
- var dlgSoftFloat32FPCompareGTFpscr = new SoftFloat32FPCompareGTFpscr(SoftFloat32.FPCompareGTFpscr); // A32 only.
- var dlgSoftFloat32FPCompareLE = new SoftFloat32FPCompareLE(SoftFloat32.FPCompareLE);
- var dlgSoftFloat32FPCompareLEFpscr = new SoftFloat32FPCompareLEFpscr(SoftFloat32.FPCompareLEFpscr); // A32 only.
- var dlgSoftFloat32FPCompareLT = new SoftFloat32FPCompareLT(SoftFloat32.FPCompareLT);
- var dlgSoftFloat32FPCompareLTFpscr = new SoftFloat32FPCompareLTFpscr(SoftFloat32.FPCompareLTFpscr); // A32 only.
- var dlgSoftFloat32FPDiv = new SoftFloat32FPDiv(SoftFloat32.FPDiv);
- var dlgSoftFloat32FPMax = new SoftFloat32FPMax(SoftFloat32.FPMax);
- var dlgSoftFloat32FPMaxFpscr = new SoftFloat32FPMaxFpscr(SoftFloat32.FPMaxFpscr); // A32 only.
- var dlgSoftFloat32FPMaxNum = new SoftFloat32FPMaxNum(SoftFloat32.FPMaxNum);
- var dlgSoftFloat32FPMaxNumFpscr = new SoftFloat32FPMaxNumFpscr(SoftFloat32.FPMaxNumFpscr); // A32 only.
- var dlgSoftFloat32FPMin = new SoftFloat32FPMin(SoftFloat32.FPMin);
- var dlgSoftFloat32FPMinFpscr = new SoftFloat32FPMinFpscr(SoftFloat32.FPMinFpscr); // A32 only.
- var dlgSoftFloat32FPMinNum = new SoftFloat32FPMinNum(SoftFloat32.FPMinNum);
- var dlgSoftFloat32FPMinNumFpscr = new SoftFloat32FPMinNumFpscr(SoftFloat32.FPMinNumFpscr); // A32 only.
- var dlgSoftFloat32FPMul = new SoftFloat32FPMul(SoftFloat32.FPMul);
- var dlgSoftFloat32FPMulFpscr = new SoftFloat32FPMulFpscr(SoftFloat32.FPMulFpscr); // A32 only.
- var dlgSoftFloat32FPMulAdd = new SoftFloat32FPMulAdd(SoftFloat32.FPMulAdd);
- var dlgSoftFloat32FPMulAddFpscr = new SoftFloat32FPMulAddFpscr(SoftFloat32.FPMulAddFpscr); // A32 only.
- var dlgSoftFloat32FPMulSub = new SoftFloat32FPMulSub(SoftFloat32.FPMulSub);
- var dlgSoftFloat32FPMulSubFpscr = new SoftFloat32FPMulSubFpscr(SoftFloat32.FPMulSubFpscr); // A32 only.
- var dlgSoftFloat32FPMulX = new SoftFloat32FPMulX(SoftFloat32.FPMulX);
- var dlgSoftFloat32FPNegMulAdd = new SoftFloat32FPNegMulAdd(SoftFloat32.FPNegMulAdd);
- var dlgSoftFloat32FPNegMulSub = new SoftFloat32FPNegMulSub(SoftFloat32.FPNegMulSub);
- var dlgSoftFloat32FPRecipEstimate = new SoftFloat32FPRecipEstimate(SoftFloat32.FPRecipEstimate);
- var dlgSoftFloat32FPRecipEstimateFpscr = new SoftFloat32FPRecipEstimateFpscr(SoftFloat32.FPRecipEstimateFpscr); // A32 only.
- var dlgSoftFloat32FPRecipStep = new SoftFloat32FPRecipStep(SoftFloat32.FPRecipStep); // A32 only.
- var dlgSoftFloat32FPRecipStepFused = new SoftFloat32FPRecipStepFused(SoftFloat32.FPRecipStepFused);
- var dlgSoftFloat32FPRecpX = new SoftFloat32FPRecpX(SoftFloat32.FPRecpX);
- var dlgSoftFloat32FPRSqrtEstimate = new SoftFloat32FPRSqrtEstimate(SoftFloat32.FPRSqrtEstimate);
- var dlgSoftFloat32FPRSqrtEstimateFpscr = new SoftFloat32FPRSqrtEstimateFpscr(SoftFloat32.FPRSqrtEstimateFpscr); // A32 only.
- var dlgSoftFloat32FPRSqrtStep = new SoftFloat32FPRSqrtStep(SoftFloat32.FPRSqrtStep); // A32 only.
- var dlgSoftFloat32FPRSqrtStepFused = new SoftFloat32FPRSqrtStepFused(SoftFloat32.FPRSqrtStepFused);
- var dlgSoftFloat32FPSqrt = new SoftFloat32FPSqrt(SoftFloat32.FPSqrt);
- var dlgSoftFloat32FPSub = new SoftFloat32FPSub(SoftFloat32.FPSub);
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAdd)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAddFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompare)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQ)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGE)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGEFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGT)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGTFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLE)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLEFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLT)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLTFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPDiv)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMax)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNum)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNumFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMin)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNum)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNumFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMul)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAdd)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAddFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSub)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSubFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulX)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulAdd)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulSub)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimate)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimateFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStep))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStepFused)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecpX)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimate)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimateFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStep))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStepFused)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSqrt)));
+ SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSub)));
- var dlgSoftFloat32_16FPConvert = new SoftFloat32_16FPConvert(SoftFloat32_16.FPConvert);
+ SetDelegateInfo(typeof(SoftFloat32_16).GetMethod(nameof(SoftFloat32_16.FPConvert)));
- var dlgSoftFloat64FPAdd = new SoftFloat64FPAdd(SoftFloat64.FPAdd);
- var dlgSoftFloat64FPAddFpscr = new SoftFloat64FPAddFpscr(SoftFloat64.FPAddFpscr); // A32 only.
- var dlgSoftFloat64FPCompare = new SoftFloat64FPCompare(SoftFloat64.FPCompare);
- var dlgSoftFloat64FPCompareEQ = new SoftFloat64FPCompareEQ(SoftFloat64.FPCompareEQ);
- var dlgSoftFloat64FPCompareEQFpscr = new SoftFloat64FPCompareEQFpscr(SoftFloat64.FPCompareEQFpscr); // A32 only.
- var dlgSoftFloat64FPCompareGE = new SoftFloat64FPCompareGE(SoftFloat64.FPCompareGE);
- var dlgSoftFloat64FPCompareGEFpscr = new SoftFloat64FPCompareGEFpscr(SoftFloat64.FPCompareGEFpscr); // A32 only.
- var dlgSoftFloat64FPCompareGT = new SoftFloat64FPCompareGT(SoftFloat64.FPCompareGT);
- var dlgSoftFloat64FPCompareGTFpscr = new SoftFloat64FPCompareGTFpscr(SoftFloat64.FPCompareGTFpscr); // A32 only.
- var dlgSoftFloat64FPCompareLE = new SoftFloat64FPCompareLE(SoftFloat64.FPCompareLE);
- var dlgSoftFloat64FPCompareLEFpscr = new SoftFloat64FPCompareLEFpscr(SoftFloat64.FPCompareLEFpscr); // A32 only.
- var dlgSoftFloat64FPCompareLT = new SoftFloat64FPCompareLT(SoftFloat64.FPCompareLT);
- var dlgSoftFloat64FPCompareLTFpscr = new SoftFloat64FPCompareLTFpscr(SoftFloat64.FPCompareLTFpscr); // A32 only.
- var dlgSoftFloat64FPDiv = new SoftFloat64FPDiv(SoftFloat64.FPDiv);
- var dlgSoftFloat64FPMax = new SoftFloat64FPMax(SoftFloat64.FPMax);
- var dlgSoftFloat64FPMaxFpscr = new SoftFloat64FPMaxFpscr(SoftFloat64.FPMaxFpscr); // A32 only.
- var dlgSoftFloat64FPMaxNum = new SoftFloat64FPMaxNum(SoftFloat64.FPMaxNum);
- var dlgSoftFloat64FPMaxNumFpscr = new SoftFloat64FPMaxNumFpscr(SoftFloat64.FPMaxNumFpscr); // A32 only.
- var dlgSoftFloat64FPMin = new SoftFloat64FPMin(SoftFloat64.FPMin);
- var dlgSoftFloat64FPMinFpscr = new SoftFloat64FPMinFpscr(SoftFloat64.FPMinFpscr); // A32 only.
- var dlgSoftFloat64FPMinNum = new SoftFloat64FPMinNum(SoftFloat64.FPMinNum);
- var dlgSoftFloat64FPMinNumFpscr = new SoftFloat64FPMinNumFpscr(SoftFloat64.FPMinNumFpscr); // A32 only.
- var dlgSoftFloat64FPMul = new SoftFloat64FPMul(SoftFloat64.FPMul);
- var dlgSoftFloat64FPMulFpscr = new SoftFloat64FPMulFpscr(SoftFloat64.FPMulFpscr); // A32 only.
- var dlgSoftFloat64FPMulAdd = new SoftFloat64FPMulAdd(SoftFloat64.FPMulAdd);
- var dlgSoftFloat64FPMulAddFpscr = new SoftFloat64FPMulAddFpscr(SoftFloat64.FPMulAddFpscr); // A32 only.
- var dlgSoftFloat64FPMulSub = new SoftFloat64FPMulSub(SoftFloat64.FPMulSub);
- var dlgSoftFloat64FPMulSubFpscr = new SoftFloat64FPMulSubFpscr(SoftFloat64.FPMulSubFpscr); // A32 only.
- var dlgSoftFloat64FPMulX = new SoftFloat64FPMulX(SoftFloat64.FPMulX);
- var dlgSoftFloat64FPNegMulAdd = new SoftFloat64FPNegMulAdd(SoftFloat64.FPNegMulAdd);
- var dlgSoftFloat64FPNegMulSub = new SoftFloat64FPNegMulSub(SoftFloat64.FPNegMulSub);
- var dlgSoftFloat64FPRecipEstimate = new SoftFloat64FPRecipEstimate(SoftFloat64.FPRecipEstimate);
- var dlgSoftFloat64FPRecipEstimateFpscr = new SoftFloat64FPRecipEstimateFpscr(SoftFloat64.FPRecipEstimateFpscr); // A32 only.
- var dlgSoftFloat64FPRecipStep = new SoftFloat64FPRecipStep(SoftFloat64.FPRecipStep); // A32 only.
- var dlgSoftFloat64FPRecipStepFused = new SoftFloat64FPRecipStepFused(SoftFloat64.FPRecipStepFused);
- var dlgSoftFloat64FPRecpX = new SoftFloat64FPRecpX(SoftFloat64.FPRecpX);
- var dlgSoftFloat64FPRSqrtEstimate = new SoftFloat64FPRSqrtEstimate(SoftFloat64.FPRSqrtEstimate);
- var dlgSoftFloat64FPRSqrtEstimateFpscr = new SoftFloat64FPRSqrtEstimateFpscr(SoftFloat64.FPRSqrtEstimateFpscr); // A32 only.
- var dlgSoftFloat64FPRSqrtStep = new SoftFloat64FPRSqrtStep(SoftFloat64.FPRSqrtStep); // A32 only.
- var dlgSoftFloat64FPRSqrtStepFused = new SoftFloat64FPRSqrtStepFused(SoftFloat64.FPRSqrtStepFused);
- var dlgSoftFloat64FPSqrt = new SoftFloat64FPSqrt(SoftFloat64.FPSqrt);
- var dlgSoftFloat64FPSub = new SoftFloat64FPSub(SoftFloat64.FPSub);
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAdd)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAddFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompare)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQ)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGE)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGEFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGT)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGTFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLE)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLEFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLT)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLTFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPDiv)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMax)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNum)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNumFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMin)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNum)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNumFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMul)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAdd)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAddFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSub)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSubFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulX)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulAdd)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulSub)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimate)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimateFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStep))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStepFused)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecpX)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimate)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimateFpscr))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStep))); // A32 only.
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStepFused)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSqrt)));
+ SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSub)));
- var dlgSoftFloat64_16FPConvert = new SoftFloat64_16FPConvert(SoftFloat64_16.FPConvert);
-
- SetDelegateInfo(dlgMathAbs, Marshal.GetFunctionPointerForDelegate(dlgMathAbs));
- SetDelegateInfo(dlgMathCeiling, Marshal.GetFunctionPointerForDelegate(dlgMathCeiling));
- SetDelegateInfo(dlgMathFloor, Marshal.GetFunctionPointerForDelegate(dlgMathFloor));
- SetDelegateInfo(dlgMathRound, Marshal.GetFunctionPointerForDelegate(dlgMathRound));
- SetDelegateInfo(dlgMathTruncate, Marshal.GetFunctionPointerForDelegate(dlgMathTruncate));
-
- SetDelegateInfo(dlgMathFAbs, Marshal.GetFunctionPointerForDelegate(dlgMathFAbs));
- SetDelegateInfo(dlgMathFCeiling, Marshal.GetFunctionPointerForDelegate(dlgMathFCeiling));
- SetDelegateInfo(dlgMathFFloor, Marshal.GetFunctionPointerForDelegate(dlgMathFFloor));
- SetDelegateInfo(dlgMathFRound, Marshal.GetFunctionPointerForDelegate(dlgMathFRound));
- SetDelegateInfo(dlgMathFTruncate, Marshal.GetFunctionPointerForDelegate(dlgMathFTruncate));
-
- SetDelegateInfo(dlgNativeInterfaceBreak, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceBreak));
- SetDelegateInfo(dlgNativeInterfaceCheckSynchronization, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceCheckSynchronization));
- SetDelegateInfo(dlgNativeInterfaceEnqueueForRejit, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceEnqueueForRejit));
- SetDelegateInfo(dlgNativeInterfaceGetCntfrqEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntfrqEl0));
- SetDelegateInfo(dlgNativeInterfaceGetCntpctEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntpctEl0));
- SetDelegateInfo(dlgNativeInterfaceGetCntvctEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntvctEl0));
- SetDelegateInfo(dlgNativeInterfaceGetCtrEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCtrEl0));
- SetDelegateInfo(dlgNativeInterfaceGetDczidEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetDczidEl0));
- SetDelegateInfo(dlgNativeInterfaceGetFunctionAddress, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetFunctionAddress));
- SetDelegateInfo(dlgNativeInterfaceInvalidateCacheLine, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceInvalidateCacheLine));
- SetDelegateInfo(dlgNativeInterfaceReadByte, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadByte));
- SetDelegateInfo(dlgNativeInterfaceReadUInt16, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt16));
- SetDelegateInfo(dlgNativeInterfaceReadUInt32, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt32));
- SetDelegateInfo(dlgNativeInterfaceReadUInt64, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt64));
- SetDelegateInfo(dlgNativeInterfaceReadVector128, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadVector128));
- SetDelegateInfo(dlgNativeInterfaceSignalMemoryTracking, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceSignalMemoryTracking));
- SetDelegateInfo(dlgNativeInterfaceSupervisorCall, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceSupervisorCall));
- SetDelegateInfo(dlgNativeInterfaceThrowInvalidMemoryAccess, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceThrowInvalidMemoryAccess));
- SetDelegateInfo(dlgNativeInterfaceUndefined, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceUndefined));
- SetDelegateInfo(dlgNativeInterfaceWriteByte, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteByte));
- SetDelegateInfo(dlgNativeInterfaceWriteUInt16, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt16));
- SetDelegateInfo(dlgNativeInterfaceWriteUInt32, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt32));
- SetDelegateInfo(dlgNativeInterfaceWriteUInt64, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt64));
- SetDelegateInfo(dlgNativeInterfaceWriteVector128, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteVector128));
-
- SetDelegateInfo(dlgSoftFallbackCountLeadingSigns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCountLeadingSigns));
- SetDelegateInfo(dlgSoftFallbackCountLeadingZeros, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCountLeadingZeros));
- SetDelegateInfo(dlgSoftFallbackCrc32b, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32b));
- SetDelegateInfo(dlgSoftFallbackCrc32cb, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cb));
- SetDelegateInfo(dlgSoftFallbackCrc32ch, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32ch));
- SetDelegateInfo(dlgSoftFallbackCrc32cw, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cw));
- SetDelegateInfo(dlgSoftFallbackCrc32cx, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cx));
- SetDelegateInfo(dlgSoftFallbackCrc32h, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32h));
- SetDelegateInfo(dlgSoftFallbackCrc32w, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32w));
- SetDelegateInfo(dlgSoftFallbackCrc32x, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32x));
- SetDelegateInfo(dlgSoftFallbackDecrypt, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackDecrypt));
- SetDelegateInfo(dlgSoftFallbackEncrypt, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackEncrypt));
- SetDelegateInfo(dlgSoftFallbackFixedRotate, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackFixedRotate));
- SetDelegateInfo(dlgSoftFallbackHashChoose, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashChoose));
- SetDelegateInfo(dlgSoftFallbackHashLower, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashLower));
- SetDelegateInfo(dlgSoftFallbackHashMajority, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashMajority));
- SetDelegateInfo(dlgSoftFallbackHashParity, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashParity));
- SetDelegateInfo(dlgSoftFallbackHashUpper, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashUpper));
- SetDelegateInfo(dlgSoftFallbackInverseMixColumns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackInverseMixColumns));
- SetDelegateInfo(dlgSoftFallbackMixColumns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackMixColumns));
- SetDelegateInfo(dlgSoftFallbackPolynomialMult64_128, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackPolynomialMult64_128));
- SetDelegateInfo(dlgSoftFallbackSatF32ToS32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToS32));
- SetDelegateInfo(dlgSoftFallbackSatF32ToS64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToS64));
- SetDelegateInfo(dlgSoftFallbackSatF32ToU32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToU32));
- SetDelegateInfo(dlgSoftFallbackSatF32ToU64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToU64));
- SetDelegateInfo(dlgSoftFallbackSatF64ToS32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToS32));
- SetDelegateInfo(dlgSoftFallbackSatF64ToS64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToS64));
- SetDelegateInfo(dlgSoftFallbackSatF64ToU32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToU32));
- SetDelegateInfo(dlgSoftFallbackSatF64ToU64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToU64));
- SetDelegateInfo(dlgSoftFallbackSha1SchedulePart1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha1SchedulePart1));
- SetDelegateInfo(dlgSoftFallbackSha1SchedulePart2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha1SchedulePart2));
- SetDelegateInfo(dlgSoftFallbackSha256SchedulePart1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha256SchedulePart1));
- SetDelegateInfo(dlgSoftFallbackSha256SchedulePart2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha256SchedulePart2));
- SetDelegateInfo(dlgSoftFallbackSignedShrImm64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSignedShrImm64));
- SetDelegateInfo(dlgSoftFallbackTbl1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl1));
- SetDelegateInfo(dlgSoftFallbackTbl2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl2));
- SetDelegateInfo(dlgSoftFallbackTbl3, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl3));
- SetDelegateInfo(dlgSoftFallbackTbl4, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl4));
- SetDelegateInfo(dlgSoftFallbackTbx1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx1));
- SetDelegateInfo(dlgSoftFallbackTbx2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx2));
- SetDelegateInfo(dlgSoftFallbackTbx3, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx3));
- SetDelegateInfo(dlgSoftFallbackTbx4, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx4));
- SetDelegateInfo(dlgSoftFallbackUnsignedShrImm64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackUnsignedShrImm64));
-
- SetDelegateInfo(dlgSoftFloat16_32FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat16_32FPConvert));
- SetDelegateInfo(dlgSoftFloat16_64FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat16_64FPConvert));
-
- SetDelegateInfo(dlgSoftFloat32FPAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPAdd));
- SetDelegateInfo(dlgSoftFloat32FPAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPAddFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompare, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompare));
- SetDelegateInfo(dlgSoftFloat32FPCompareEQ, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareEQ));
- SetDelegateInfo(dlgSoftFloat32FPCompareEQFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareEQFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompareGE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGE));
- SetDelegateInfo(dlgSoftFloat32FPCompareGEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGEFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompareGT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGT));
- SetDelegateInfo(dlgSoftFloat32FPCompareGTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGTFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompareLE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLE));
- SetDelegateInfo(dlgSoftFloat32FPCompareLEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLEFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPCompareLT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLT));
- SetDelegateInfo(dlgSoftFloat32FPCompareLTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLTFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPDiv, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPDiv));
- SetDelegateInfo(dlgSoftFloat32FPMax, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMax));
- SetDelegateInfo(dlgSoftFloat32FPMaxFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMaxNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxNum));
- SetDelegateInfo(dlgSoftFloat32FPMaxNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxNumFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMin, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMin));
- SetDelegateInfo(dlgSoftFloat32FPMinFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMinNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinNum));
- SetDelegateInfo(dlgSoftFloat32FPMinNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinNumFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMul, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMul));
- SetDelegateInfo(dlgSoftFloat32FPMulFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulAdd));
- SetDelegateInfo(dlgSoftFloat32FPMulAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulAddFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulSub));
- SetDelegateInfo(dlgSoftFloat32FPMulSubFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulSubFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPMulX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulX));
- SetDelegateInfo(dlgSoftFloat32FPNegMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPNegMulAdd));
- SetDelegateInfo(dlgSoftFloat32FPNegMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPNegMulSub));
- SetDelegateInfo(dlgSoftFloat32FPRecipEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipEstimate));
- SetDelegateInfo(dlgSoftFloat32FPRecipEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipEstimateFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPRecipStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipStep)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPRecipStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipStepFused));
- SetDelegateInfo(dlgSoftFloat32FPRecpX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecpX));
- SetDelegateInfo(dlgSoftFloat32FPRSqrtEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtEstimate));
- SetDelegateInfo(dlgSoftFloat32FPRSqrtEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtEstimateFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPRSqrtStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtStep)); // A32 only.
- SetDelegateInfo(dlgSoftFloat32FPRSqrtStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtStepFused));
- SetDelegateInfo(dlgSoftFloat32FPSqrt, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPSqrt));
- SetDelegateInfo(dlgSoftFloat32FPSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPSub));
-
- SetDelegateInfo(dlgSoftFloat32_16FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32_16FPConvert));
-
- SetDelegateInfo(dlgSoftFloat64FPAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPAdd));
- SetDelegateInfo(dlgSoftFloat64FPAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPAddFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompare, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompare));
- SetDelegateInfo(dlgSoftFloat64FPCompareEQ, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareEQ));
- SetDelegateInfo(dlgSoftFloat64FPCompareEQFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareEQFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompareGE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGE));
- SetDelegateInfo(dlgSoftFloat64FPCompareGEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGEFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompareGT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGT));
- SetDelegateInfo(dlgSoftFloat64FPCompareGTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGTFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompareLE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLE));
- SetDelegateInfo(dlgSoftFloat64FPCompareLEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLEFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPCompareLT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLT));
- SetDelegateInfo(dlgSoftFloat64FPCompareLTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLTFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPDiv, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPDiv));
- SetDelegateInfo(dlgSoftFloat64FPMax, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMax));
- SetDelegateInfo(dlgSoftFloat64FPMaxFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMaxNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxNum));
- SetDelegateInfo(dlgSoftFloat64FPMaxNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxNumFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMin, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMin));
- SetDelegateInfo(dlgSoftFloat64FPMinFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMinNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinNum));
- SetDelegateInfo(dlgSoftFloat64FPMinNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinNumFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMul, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMul));
- SetDelegateInfo(dlgSoftFloat64FPMulFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulAdd));
- SetDelegateInfo(dlgSoftFloat64FPMulAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulAddFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulSub));
- SetDelegateInfo(dlgSoftFloat64FPMulSubFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulSubFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPMulX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulX));
- SetDelegateInfo(dlgSoftFloat64FPNegMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPNegMulAdd));
- SetDelegateInfo(dlgSoftFloat64FPNegMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPNegMulSub));
- SetDelegateInfo(dlgSoftFloat64FPRecipEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipEstimate));
- SetDelegateInfo(dlgSoftFloat64FPRecipEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipEstimateFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPRecipStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipStep)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPRecipStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipStepFused));
- SetDelegateInfo(dlgSoftFloat64FPRecpX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecpX));
- SetDelegateInfo(dlgSoftFloat64FPRSqrtEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtEstimate));
- SetDelegateInfo(dlgSoftFloat64FPRSqrtEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtEstimateFpscr)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPRSqrtStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtStep)); // A32 only.
- SetDelegateInfo(dlgSoftFloat64FPRSqrtStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtStepFused));
- SetDelegateInfo(dlgSoftFloat64FPSqrt, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPSqrt));
- SetDelegateInfo(dlgSoftFloat64FPSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPSub));
-
- SetDelegateInfo(dlgSoftFloat64_16FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64_16FPConvert));
+ SetDelegateInfo(typeof(SoftFloat64_16).GetMethod(nameof(SoftFloat64_16.FPConvert)));
}
-
- private delegate double MathAbs(double value);
- private delegate double MathCeiling(double a);
- private delegate double MathFloor(double d);
- private delegate double MathRound(double value, MidpointRounding mode);
- private delegate double MathTruncate(double d);
-
- private delegate float MathFAbs(float x);
- private delegate float MathFCeiling(float x);
- private delegate float MathFFloor(float x);
- private delegate float MathFRound(float x, MidpointRounding mode);
- private delegate float MathFTruncate(float x);
-
- private delegate void NativeInterfaceBreak(ulong address, int imm);
- private delegate bool NativeInterfaceCheckSynchronization();
- private delegate void NativeInterfaceEnqueueForRejit(ulong address);
- private delegate ulong NativeInterfaceGetCntfrqEl0();
- private delegate ulong NativeInterfaceGetCntpctEl0();
- private delegate ulong NativeInterfaceGetCntvctEl0();
- private delegate ulong NativeInterfaceGetCtrEl0();
- private delegate ulong NativeInterfaceGetDczidEl0();
- private delegate ulong NativeInterfaceGetFunctionAddress(ulong address);
- private delegate void NativeInterfaceInvalidateCacheLine(ulong address);
- private delegate byte NativeInterfaceReadByte(ulong address);
- private delegate ushort NativeInterfaceReadUInt16(ulong address);
- private delegate uint NativeInterfaceReadUInt32(ulong address);
- private delegate ulong NativeInterfaceReadUInt64(ulong address);
- private delegate V128 NativeInterfaceReadVector128(ulong address);
- private delegate void NativeInterfaceSignalMemoryTracking(ulong address, ulong size, bool write);
- private delegate void NativeInterfaceSupervisorCall(ulong address, int imm);
- private delegate void NativeInterfaceThrowInvalidMemoryAccess(ulong address);
- private delegate void NativeInterfaceUndefined(ulong address, int opCode);
- private delegate void NativeInterfaceWriteByte(ulong address, byte value);
- private delegate void NativeInterfaceWriteUInt16(ulong address, ushort value);
- private delegate void NativeInterfaceWriteUInt32(ulong address, uint value);
- private delegate void NativeInterfaceWriteUInt64(ulong address, ulong value);
- private delegate void NativeInterfaceWriteVector128(ulong address, V128 value);
-
- private delegate ulong SoftFallbackCountLeadingSigns(ulong value, int size);
- private delegate ulong SoftFallbackCountLeadingZeros(ulong value, int size);
- private delegate uint SoftFallbackCrc32b(uint crc, byte value);
- private delegate uint SoftFallbackCrc32cb(uint crc, byte value);
- private delegate uint SoftFallbackCrc32ch(uint crc, ushort value);
- private delegate uint SoftFallbackCrc32cw(uint crc, uint value);
- private delegate uint SoftFallbackCrc32cx(uint crc, ulong value);
- private delegate uint SoftFallbackCrc32h(uint crc, ushort value);
- private delegate uint SoftFallbackCrc32w(uint crc, uint value);
- private delegate uint SoftFallbackCrc32x(uint crc, ulong value);
- private delegate V128 SoftFallbackDecrypt(V128 value, V128 roundKey);
- private delegate V128 SoftFallbackEncrypt(V128 value, V128 roundKey);
- private delegate uint SoftFallbackFixedRotate(uint hash_e);
- private delegate V128 SoftFallbackHashChoose(V128 hash_abcd, uint hash_e, V128 wk);
- private delegate V128 SoftFallbackHashLower(V128 hash_abcd, V128 hash_efgh, V128 wk);
- private delegate V128 SoftFallbackHashMajority(V128 hash_abcd, uint hash_e, V128 wk);
- private delegate V128 SoftFallbackHashParity(V128 hash_abcd, uint hash_e, V128 wk);
- private delegate V128 SoftFallbackHashUpper(V128 hash_abcd, V128 hash_efgh, V128 wk);
- private delegate V128 SoftFallbackInverseMixColumns(V128 value);
- private delegate V128 SoftFallbackMixColumns(V128 value);
- private delegate V128 SoftFallbackPolynomialMult64_128(ulong op1, ulong op2);
- private delegate int SoftFallbackSatF32ToS32(float value);
- private delegate long SoftFallbackSatF32ToS64(float value);
- private delegate uint SoftFallbackSatF32ToU32(float value);
- private delegate ulong SoftFallbackSatF32ToU64(float value);
- private delegate int SoftFallbackSatF64ToS32(double value);
- private delegate long SoftFallbackSatF64ToS64(double value);
- private delegate uint SoftFallbackSatF64ToU32(double value);
- private delegate ulong SoftFallbackSatF64ToU64(double value);
- private delegate V128 SoftFallbackSha1SchedulePart1(V128 w0_3, V128 w4_7, V128 w8_11);
- private delegate V128 SoftFallbackSha1SchedulePart2(V128 tw0_3, V128 w12_15);
- private delegate V128 SoftFallbackSha256SchedulePart1(V128 w0_3, V128 w4_7);
- private delegate V128 SoftFallbackSha256SchedulePart2(V128 w0_3, V128 w8_11, V128 w12_15);
- private delegate long SoftFallbackSignedShrImm64(long value, long roundConst, int shift);
- private delegate V128 SoftFallbackTbl1(V128 vector, int bytes, V128 tb0);
- private delegate V128 SoftFallbackTbl2(V128 vector, int bytes, V128 tb0, V128 tb1);
- private delegate V128 SoftFallbackTbl3(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2);
- private delegate V128 SoftFallbackTbl4(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3);
- private delegate V128 SoftFallbackTbx1(V128 dest, V128 vector, int bytes, V128 tb0);
- private delegate V128 SoftFallbackTbx2(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1);
- private delegate V128 SoftFallbackTbx3(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2);
- private delegate V128 SoftFallbackTbx4(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3);
- private delegate ulong SoftFallbackUnsignedShrImm64(ulong value, long roundConst, int shift);
-
- private delegate float SoftFloat16_32FPConvert(ushort valueBits);
-
- private delegate double SoftFloat16_64FPConvert(ushort valueBits);
-
- private delegate float SoftFloat32FPAdd(float value1, float value2);
- private delegate float SoftFloat32FPAddFpscr(float value1, float value2, bool standardFpscr);
- private delegate int SoftFloat32FPCompare(float value1, float value2, bool signalNaNs);
- private delegate float SoftFloat32FPCompareEQ(float value1, float value2);
- private delegate float SoftFloat32FPCompareEQFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPCompareGE(float value1, float value2);
- private delegate float SoftFloat32FPCompareGEFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPCompareGT(float value1, float value2);
- private delegate float SoftFloat32FPCompareGTFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPCompareLE(float value1, float value2);
- private delegate float SoftFloat32FPCompareLEFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPCompareLT(float value1, float value2);
- private delegate float SoftFloat32FPCompareLTFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPDiv(float value1, float value2);
- private delegate float SoftFloat32FPMax(float value1, float value2);
- private delegate float SoftFloat32FPMaxFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMaxNum(float value1, float value2);
- private delegate float SoftFloat32FPMaxNumFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMin(float value1, float value2);
- private delegate float SoftFloat32FPMinFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMinNum(float value1, float value2);
- private delegate float SoftFloat32FPMinNumFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMul(float value1, float value2);
- private delegate float SoftFloat32FPMulFpscr(float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMulAdd(float valueA, float value1, float value2);
- private delegate float SoftFloat32FPMulAddFpscr(float valueA, float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMulSub(float valueA, float value1, float value2);
- private delegate float SoftFloat32FPMulSubFpscr(float valueA, float value1, float value2, bool standardFpscr);
- private delegate float SoftFloat32FPMulX(float value1, float value2);
- private delegate float SoftFloat32FPNegMulAdd(float valueA, float value1, float value2);
- private delegate float SoftFloat32FPNegMulSub(float valueA, float value1, float value2);
- private delegate float SoftFloat32FPRecipEstimate(float value);
- private delegate float SoftFloat32FPRecipEstimateFpscr(float value, bool standardFpscr);
- private delegate float SoftFloat32FPRecipStep(float value1, float value2);
- private delegate float SoftFloat32FPRecipStepFused(float value1, float value2);
- private delegate float SoftFloat32FPRecpX(float value);
- private delegate float SoftFloat32FPRSqrtEstimate(float value);
- private delegate float SoftFloat32FPRSqrtEstimateFpscr(float value, bool standardFpscr);
- private delegate float SoftFloat32FPRSqrtStep(float value1, float value2);
- private delegate float SoftFloat32FPRSqrtStepFused(float value1, float value2);
- private delegate float SoftFloat32FPSqrt(float value);
- private delegate float SoftFloat32FPSub(float value1, float value2);
-
- private delegate ushort SoftFloat32_16FPConvert(float value);
-
- private delegate double SoftFloat64FPAdd(double value1, double value2);
- private delegate double SoftFloat64FPAddFpscr(double value1, double value2, bool standardFpscr);
- private delegate int SoftFloat64FPCompare(double value1, double value2, bool signalNaNs);
- private delegate double SoftFloat64FPCompareEQ(double value1, double value2);
- private delegate double SoftFloat64FPCompareEQFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPCompareGE(double value1, double value2);
- private delegate double SoftFloat64FPCompareGEFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPCompareGT(double value1, double value2);
- private delegate double SoftFloat64FPCompareGTFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPCompareLE(double value1, double value2);
- private delegate double SoftFloat64FPCompareLEFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPCompareLT(double value1, double value2);
- private delegate double SoftFloat64FPCompareLTFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPDiv(double value1, double value2);
- private delegate double SoftFloat64FPMax(double value1, double value2);
- private delegate double SoftFloat64FPMaxFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMaxNum(double value1, double value2);
- private delegate double SoftFloat64FPMaxNumFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMin(double value1, double value2);
- private delegate double SoftFloat64FPMinFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMinNum(double value1, double value2);
- private delegate double SoftFloat64FPMinNumFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMul(double value1, double value2);
- private delegate double SoftFloat64FPMulFpscr(double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMulAdd(double valueA, double value1, double value2);
- private delegate double SoftFloat64FPMulAddFpscr(double valueA, double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMulSub(double valueA, double value1, double value2);
- private delegate double SoftFloat64FPMulSubFpscr(double valueA, double value1, double value2, bool standardFpscr);
- private delegate double SoftFloat64FPMulX(double value1, double value2);
- private delegate double SoftFloat64FPNegMulAdd(double valueA, double value1, double value2);
- private delegate double SoftFloat64FPNegMulSub(double valueA, double value1, double value2);
- private delegate double SoftFloat64FPRecipEstimate(double value);
- private delegate double SoftFloat64FPRecipEstimateFpscr(double value, bool standardFpscr);
- private delegate double SoftFloat64FPRecipStep(double value1, double value2);
- private delegate double SoftFloat64FPRecipStepFused(double value1, double value2);
- private delegate double SoftFloat64FPRecpX(double value);
- private delegate double SoftFloat64FPRSqrtEstimate(double value);
- private delegate double SoftFloat64FPRSqrtEstimateFpscr(double value, bool standardFpscr);
- private delegate double SoftFloat64FPRSqrtStep(double value1, double value2);
- private delegate double SoftFloat64FPRSqrtStepFused(double value1, double value2);
- private delegate double SoftFloat64FPSqrt(double value);
- private delegate double SoftFloat64FPSub(double value1, double value2);
-
- private delegate ushort SoftFloat64_16FPConvert(double value);
}
}
diff --git a/src/ARMeilleure/Translation/EmitterContext.cs b/src/ARMeilleure/Translation/EmitterContext.cs
index 22b6b9842..3d800e16f 100644
--- a/src/ARMeilleure/Translation/EmitterContext.cs
+++ b/src/ARMeilleure/Translation/EmitterContext.cs
@@ -97,7 +97,7 @@ namespace ARMeilleure.Translation
public virtual Operand Call(MethodInfo info, params Operand[] callArgs)
{
- nint funcPtr = Delegates.GetDelegateFuncPtr(info);
+ nint funcPtr = info.MethodHandle.GetFunctionPointer();
OperandType returnType = GetOperandType(info.ReturnType);
diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs
index 4675abc49..894e825cf 100644
--- a/src/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/src/ARMeilleure/Translation/PTC/Ptc.cs
@@ -29,8 +29,8 @@ namespace ARMeilleure.Translation.PTC
{
private const string OuterHeaderMagicString = "PTCohd\0\0";
private const string InnerHeaderMagicString = "PTCihd\0\0";
-
- private const uint InternalVersion = 6997; //! To be incremented manually for each change to the ARMeilleure project.
+
+ private const uint InternalVersion = 6998; //! To be incremented manually for each change to the ARMeilleure project.
private const string ActualDir = "0";
private const string BackupDir = "1";
diff --git a/src/Ryujinx.Common/Configuration/DirtyHack.cs b/src/Ryujinx.Common/Configuration/DirtyHack.cs
index 6e21fe44e..9ab9a26a5 100644
--- a/src/Ryujinx.Common/Configuration/DirtyHack.cs
+++ b/src/Ryujinx.Common/Configuration/DirtyHack.cs
@@ -25,7 +25,7 @@ namespace Ryujinx.Common.Configuration
{
var unpackedFields = packedHack.UnpackBitFields(PackedFormat);
if (unpackedFields is not [var hack, var value])
- throw new ArgumentException(nameof(packedHack));
+ throw new Exception("The unpack operation on the integer resulted in an invalid unpacked result.");
return new EnabledDirtyHack((DirtyHack)hack, (int)value);
}
diff --git a/src/Ryujinx.Common/ReactiveObject.cs b/src/Ryujinx.Common/ReactiveObject.cs
index 8df1e20fe..bb2ece81c 100644
--- a/src/Ryujinx.Common/ReactiveObject.cs
+++ b/src/Ryujinx.Common/ReactiveObject.cs
@@ -53,6 +53,9 @@ namespace Ryujinx.Common
{
public static void LogValueChange(LogClass logClass, ReactiveEventArgs eventArgs, string valueName)
{
+ if (eventArgs.AreValuesEqual)
+ return;
+
string message = string.Create(CultureInfo.InvariantCulture, $"{valueName} set to: {eventArgs.NewValue}");
Logger.Info?.Print(logClass, message);
@@ -65,5 +68,22 @@ namespace Ryujinx.Common
{
public T OldValue { get; } = oldValue;
public T NewValue { get; } = newValue;
+
+ public bool AreValuesEqual
+ {
+ get
+ {
+ if (OldValue == null && NewValue == null)
+ return true;
+
+ if (OldValue == null && NewValue != null)
+ return false;
+
+ if (OldValue != null && NewValue == null)
+ return false;
+
+ return OldValue!.Equals(NewValue);
+ }
+ }
}
}
diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs
index ab6cfeb03..43a1f2393 100644
--- a/src/Ryujinx.Common/TitleIDs.cs
+++ b/src/Ryujinx.Common/TitleIDs.cs
@@ -171,6 +171,7 @@ namespace Ryujinx.Common
"0100b41013c82000", // Cruis'n Blast
"01001b300b9be000", // Diablo III: Eternal Collection
"01008c8012920000", // Dying Light Platinum Edition
+ "01001cc01b2d4000", // Goat Simulator 3
"010073c01af34000", // LEGO Horizon Adventures
"0100770008dd8000", // Monster Hunter Generations Ultimate
"0100b04011742000", // Monster Hunter Rise
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs
index 910e9aea0..eb0f72af1 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs
@@ -367,7 +367,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
{
try
{
- if (_context.DirtyHacks.IsEnabled(DirtyHack.ShaderTranslationDelay))
+ if (_context.Capabilities.Api == TargetApi.Metal && _context.DirtyHacks.IsEnabled(DirtyHack.ShaderTranslationDelay))
Thread.Sleep(_context.DirtyHacks[DirtyHack.ShaderTranslationDelay]);
AsyncProgramTranslation asyncTranslation = new(guestShaders, specState, programIndex, isCompute);
diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs
index 3d197ac19..ad4cccc44 100644
--- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs
@@ -15,8 +15,10 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
_baseStorage = SharedRef.CreateMove(ref baseStorage);
}
-
- private const string Xc2TitleId = "0100e95004038000";
+
+ private const string Xc2JpTitleId = "0100f3400332c000";
+ private const string Xc2GlobalTitleId = "0100e95004038000";
+ private static bool IsXc2 => TitleIDs.CurrentApplication.Value.OrDefault() is Xc2GlobalTitleId or Xc2JpTitleId;
[CommandCmif(0)]
// Read(u64 offset, u64 length) -> buffer buffer
@@ -39,7 +41,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true);
Result result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size);
- if (context.Device.DirtyHacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix) && TitleIDs.CurrentApplication.Value == Xc2TitleId)
+ if (context.Device.DirtyHacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix) && IsXc2)
{
// Add a load-bearing sleep to avoid XC2 softlock
// https://web.archive.org/web/20240728045136/https://github.com/Ryujinx/Ryujinx/issues/2357
diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs
index c728ee9c9..a35a79e86 100644
--- a/src/Ryujinx/AppHost.cs
+++ b/src/Ryujinx/AppHost.cs
@@ -3,7 +3,6 @@ using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Input;
using Avalonia.Threading;
-using Gommon;
using LibHac.Common;
using LibHac.Ns;
using LibHac.Tools.FsSystem;
@@ -43,7 +42,6 @@ using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.Input;
using Ryujinx.Input.HLE;
-using Silk.NET.Vulkan;
using SkiaSharp;
using SPB.Graphics.Vulkan;
using System;
diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json
index 335373835..4e15935d9 100644
--- a/src/Ryujinx/Assets/locales.json
+++ b/src/Ryujinx/Assets/locales.json
@@ -1235,7 +1235,7 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "자주 묻는 질문(FAQ) 및 안내",
- "no_NO": "",
+ "no_NO": "Vanlige spørsmål og veiledninger",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "FAQ и Руководства",
@@ -1460,7 +1460,7 @@
"it_IT": "Preferito",
"ja_JP": "お気に入り",
"ko_KR": "즐겨찾기",
- "no_NO": "",
+ "no_NO": "Favoritter",
"pl_PL": "Ulubione",
"pt_BR": "Favorito",
"ru_RU": "Избранное",
@@ -2610,7 +2610,7 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "펌웨어 버전 : {0}",
- "no_NO": "",
+ "no_NO": "Fastvareversjon: {0}",
"pl_PL": "",
"pt_BR": "Versão do firmware: {0}",
"ru_RU": "Версия прошивки: {0}",
@@ -3460,7 +3460,7 @@
"it_IT": "Corea",
"ja_JP": "韓国",
"ko_KR": "한국",
- "no_NO": "",
+ "no_NO": "Koreansk",
"pl_PL": "",
"pt_BR": "Coreia",
"ru_RU": "Корея",
@@ -4010,7 +4010,7 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "PC 날짜와 시간에 동기화",
- "no_NO": "",
+ "no_NO": "Resynkroniser til PC-dato og -klokkeslett",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Повторная синхронизация с датой и временем на компьютере",
@@ -15260,7 +15260,7 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "시스템 시간을 PC의 현재 날짜 및 시간과 일치하도록 다시 동기화합니다.\n\n이 설정은 활성 설정이 아니므로 여전히 동기화되지 않을 수 있으며, 이 경우 이 버튼을 다시 클릭하면 됩니다.",
- "no_NO": "",
+ "no_NO": "Resynkroniser systemtiden slik at den samsvarer med PC-ens gjeldende dato og klokkeslett. \\Dette er ikke en aktiv innstilling, men den kan likevel komme ut av synkronisering; i så fall er det bare å klikke på denne knappen igjen.",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Повторно синхронизирует системное время, чтобы оно соответствовало текущей дате и времени вашего компьютера.\n\nЭто не активная настройка, она все еще может рассинхронизироваться; в этом случае просто нажмите эту кнопку еще раз.",
@@ -20535,7 +20535,7 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "Vulkan을 사용합니다.\nARM 맥에서 해당 플랫폼에서 잘 실행되는 게임을 플레이하는 경우 Metal 후단부를 사용합니다.",
- "no_NO": "",
+ "no_NO": "Bruker Vulkan \nPå en ARM Mac, og når du spiller et spill som kjører bra under den, bruker du Metal-backend.",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Использует Vulkan.\nНа Mac с ARM процессорами используется Metal, если игра с ним совместима и хорошо работает.",
diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs
index 3cb0afca3..5730254f7 100644
--- a/src/Ryujinx/Headless/HeadlessRyujinx.cs
+++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs
@@ -52,7 +52,7 @@ namespace Ryujinx.Headless
// Make process DPI aware for proper window sizing on high-res screens.
ForceDpiAware.Windows();
- Console.Title = $"Ryujinx Console {Program.Version} (Headless)";
+ Console.Title = $"HeadlessRyujinx Console {Program.Version}";
if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux())
{
@@ -162,6 +162,11 @@ namespace Ryujinx.Headless
}
ReloadConfig();
+
+ if (option.InheritConfig)
+ {
+ option.InheritMainConfigInput(originalArgs, ConfigurationState.Instance);
+ }
_virtualFileSystem = VirtualFileSystem.CreateInstance();
_libHacHorizonManager = new LibHacHorizonManager();
@@ -224,15 +229,7 @@ namespace Ryujinx.Headless
_enableKeyboard = option.EnableKeyboard;
_enableMouse = option.EnableMouse;
- static void LoadPlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index)
- {
- InputConfig inputConfig = HandlePlayerConfiguration(inputProfileName, inputId, index);
- if (inputConfig != null)
- {
- _inputConfiguration.Add(inputConfig);
- }
- }
LoadPlayerConfiguration(option.InputProfile1Name, option.InputId1, PlayerIndex.Player1);
LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2);
@@ -244,7 +241,6 @@ namespace Ryujinx.Headless
LoadPlayerConfiguration(option.InputProfile8Name, option.InputId8, PlayerIndex.Player8);
LoadPlayerConfiguration(option.InputProfileHandheldName, option.InputIdHandheld, PlayerIndex.Handheld);
-
if (_inputConfiguration.Count == 0)
{
return;
@@ -306,6 +302,24 @@ namespace Ryujinx.Headless
}
_inputManager.Dispose();
+
+ return;
+
+ void LoadPlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index)
+ {
+ if (index == PlayerIndex.Handheld && _inputConfiguration.Count > 0)
+ {
+ Logger.Info?.Print(LogClass.Configuration, "Skipping handheld configuration as there are already other players configured.");
+ return;
+ }
+
+ InputConfig inputConfig = option.InheritedInputConfigs[index] ?? HandlePlayerConfiguration(inputProfileName, inputId, index);
+
+ if (inputConfig != null)
+ {
+ _inputConfiguration.Add(inputConfig);
+ }
+ }
}
private static void SetupProgressHandler()
diff --git a/src/Ryujinx/Headless/Options.cs b/src/Ryujinx/Headless/Options.cs
index c0def95c1..0d7e46285 100644
--- a/src/Ryujinx/Headless/Options.cs
+++ b/src/Ryujinx/Headless/Options.cs
@@ -154,10 +154,37 @@ namespace Ryujinx.Headless
return;
bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey)));
-
- string OptionName(string propertyName) =>
- typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute()!.LongName;
}
+
+ public void InheritMainConfigInput(string[] originalArgs, ConfigurationState configurationState)
+ {
+ Dictionary indicesToProperties = new()
+ {
+ { PlayerIndex.Handheld, (nameof(InputIdHandheld), nameof(InputProfileHandheldName)) },
+ { PlayerIndex.Player1, (nameof(InputId1), nameof(InputProfile1Name)) },
+ { PlayerIndex.Player2, (nameof(InputId2), nameof(InputProfile2Name)) },
+ { PlayerIndex.Player3, (nameof(InputId3), nameof(InputProfile3Name)) },
+ { PlayerIndex.Player4, (nameof(InputId4), nameof(InputProfile4Name)) },
+ { PlayerIndex.Player5, (nameof(InputId5), nameof(InputProfile5Name)) },
+ { PlayerIndex.Player6, (nameof(InputId6), nameof(InputProfile6Name)) },
+ { PlayerIndex.Player7, (nameof(InputId7), nameof(InputProfile7Name)) },
+ { PlayerIndex.Player8, (nameof(InputId8), nameof(InputProfile8Name)) }
+ };
+
+ foreach ((PlayerIndex playerIndex, _) in indicesToProperties
+ .Where(it => NeedsOverride(it.Value.InputId) && NeedsOverride(it.Value.InputProfileName)))
+ {
+ configurationState.Hid.InputConfig.Value.FindFirst(x => x.PlayerIndex == playerIndex)
+ .IfPresent(ic => InheritedInputConfigs[playerIndex] = ic);
+ }
+
+ return;
+
+ bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey)));
+ }
+
+ private static string OptionName(string propertyName) =>
+ typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute()!.LongName;
// General
@@ -391,5 +418,7 @@ namespace Ryujinx.Headless
[Value(0, MetaName = "input", HelpText = "Input to load.", Required = true)]
public string InputPath { get; set; }
+
+ public SafeDictionary InheritedInputConfigs = new();
}
}
diff --git a/src/Ryujinx/UI/Renderer/RendererHost.axaml b/src/Ryujinx/UI/Renderer/RendererHost.axaml
deleted file mode 100644
index e0b586b45..000000000
--- a/src/Ryujinx/UI/Renderer/RendererHost.axaml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
diff --git a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs b/src/Ryujinx/UI/Renderer/RendererHost.cs
similarity index 94%
rename from src/Ryujinx/UI/Renderer/RendererHost.axaml.cs
rename to src/Ryujinx/UI/Renderer/RendererHost.cs
index fa9aec0c5..7dfec8d62 100644
--- a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs
+++ b/src/Ryujinx/UI/Renderer/RendererHost.cs
@@ -1,16 +1,15 @@
-using Avalonia;
+using Avalonia;
using Avalonia.Controls;
-using Gommon;
+using Avalonia.Media;
using Ryujinx.Ava.Utilities.Configuration;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using System;
-using System.Runtime.InteropServices;
namespace Ryujinx.Ava.UI.Renderer
{
- public partial class RendererHost : UserControl, IDisposable
+ public class RendererHost : UserControl, IDisposable
{
public readonly EmbeddedWindow EmbeddedWindow;
@@ -19,7 +18,8 @@ namespace Ryujinx.Ava.UI.Renderer
public RendererHost()
{
- InitializeComponent();
+ Focusable = true;
+ FlowDirection = FlowDirection.LeftToRight;
EmbeddedWindow = ConfigurationState.Instance.Graphics.GraphicsBackend.Value switch
{
@@ -43,8 +43,6 @@ namespace Ryujinx.Ava.UI.Renderer
public RendererHost(string titleId)
{
- InitializeComponent();
-
switch (TitleIDs.SelectGraphicsBackend(titleId, ConfigurationState.Instance.Graphics.GraphicsBackend))
{
case GraphicsBackend.OpenGl:
@@ -109,3 +107,4 @@ namespace Ryujinx.Ava.UI.Renderer
}
}
}
+
diff --git a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs
index 6bc1e1f03..979ae8253 100644
--- a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs
@@ -1,6 +1,7 @@
using Avalonia.Media.Imaging;
using Avalonia.Styling;
using Avalonia.Threading;
+using CommunityToolkit.Mvvm.ComponentModel;
using Ryujinx.Ava.Common;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Utilities.Configuration;
@@ -8,42 +9,11 @@ using System;
namespace Ryujinx.Ava.UI.ViewModels
{
- public class AboutWindowViewModel : BaseModel, IDisposable
+ public partial class AboutWindowViewModel : BaseModel, IDisposable
{
- private Bitmap _githubLogo;
- private Bitmap _discordLogo;
-
- private string _version;
-
- public Bitmap GithubLogo
- {
- get => _githubLogo;
- set
- {
- _githubLogo = value;
- OnPropertyChanged();
- }
- }
-
- public Bitmap DiscordLogo
- {
- get => _discordLogo;
- set
- {
- _discordLogo = value;
- OnPropertyChanged();
- }
- }
-
- public string Version
- {
- get => _version;
- set
- {
- _version = value;
- OnPropertyChanged();
- }
- }
+ [ObservableProperty] private Bitmap _githubLogo;
+ [ObservableProperty] private Bitmap _discordLogo;
+ [ObservableProperty] private string _version;
public string Developers => "GreemDev";
diff --git a/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs b/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs
index acc26decb..52f97cf02 100644
--- a/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs
@@ -2,6 +2,7 @@ using Avalonia.Collections;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
+using CommunityToolkit.Mvvm.ComponentModel;
using DynamicData;
using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale;
@@ -17,13 +18,13 @@ using Application = Avalonia.Application;
namespace Ryujinx.Ava.UI.ViewModels
{
- public class DownloadableContentManagerViewModel : BaseModel
+ public partial class DownloadableContentManagerViewModel : BaseModel
{
private readonly ApplicationLibrary _applicationLibrary;
private AvaloniaList _downloadableContents = new();
- private AvaloniaList _selectedDownloadableContents = new();
- private AvaloniaList _views = new();
- private bool _showBundledContentNotice = false;
+ [ObservableProperty] private AvaloniaList _selectedDownloadableContents = new();
+ [ObservableProperty] private AvaloniaList _views = new();
+ [ObservableProperty] private bool _showBundledContentNotice = false;
private string _search;
private readonly ApplicationData _applicationData;
@@ -41,26 +42,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public AvaloniaList Views
- {
- get => _views;
- set
- {
- _views = value;
- OnPropertyChanged();
- }
- }
-
- public AvaloniaList SelectedDownloadableContents
- {
- get => _selectedDownloadableContents;
- set
- {
- _selectedDownloadableContents = value;
- OnPropertyChanged();
- }
- }
-
public string Search
{
get => _search;
@@ -77,16 +58,6 @@ namespace Ryujinx.Ava.UI.ViewModels
get => string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowHeading], DownloadableContents.Count);
}
- public bool ShowBundledContentNotice
- {
- get => _showBundledContentNotice;
- set
- {
- _showBundledContentNotice = value;
- OnPropertyChanged();
- }
- }
-
public DownloadableContentManagerViewModel(ApplicationLibrary applicationLibrary, ApplicationData applicationData)
{
_applicationLibrary = applicationLibrary;
@@ -135,9 +106,9 @@ namespace Ryujinx.Ava.UI.ViewModels
// NOTE(jpr): this works around a bug where calling _views.Clear also clears SelectedDownloadableContents for
// some reason. so we save the items here and add them back after
var items = SelectedDownloadableContents.ToArray();
-
- _views.Clear();
- _views.AddRange(view);
+
+ Views.Clear();
+ Views.AddRange(view);
foreach (DownloadableContentModel item in items)
{
diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
index 6df1f76ad..e11d855a6 100644
--- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
@@ -80,7 +80,9 @@ namespace Ryujinx.Ava.UI.ViewModels
[ObservableProperty] private Brush _progressBarForegroundColor;
[ObservableProperty] private Brush _progressBarBackgroundColor;
[ObservableProperty] private Brush _vSyncModeColor;
- [ObservableProperty] private byte[] _selectedIcon;
+ #nullable enable
+ [ObservableProperty] private byte[]? _selectedIcon;
+ #nullable disable
[ObservableProperty] private int _statusBarProgressMaximum;
[ObservableProperty] private int _statusBarProgressValue;
[ObservableProperty] private string _statusBarProgressStatusText;
@@ -125,43 +127,6 @@ namespace Ryujinx.Ava.UI.ViewModels
private ApplicationData _listSelectedApplication;
private ApplicationData _gridSelectedApplication;
- public ApplicationData ListSelectedApplication
- {
- get => _listSelectedApplication;
- set
- {
- _listSelectedApplication = value;
-
-#pragma warning disable MVVMTK0034
- if (_listSelectedApplication != null && _listAppContextMenu == null)
-
- ListAppContextMenu = new ApplicationContextMenu();
- else if (_listSelectedApplication == null && _listAppContextMenu != null)
- ListAppContextMenu = null!;
-#pragma warning restore MVVMTK0034
-
- OnPropertyChanged();
- }
- }
-
- public ApplicationData GridSelectedApplication
- {
- get => _gridSelectedApplication;
- set
- {
- _gridSelectedApplication = value;
-
-#pragma warning disable MVVMTK0034
- if (_gridSelectedApplication != null && _gridAppContextMenu == null)
- GridAppContextMenu = new ApplicationContextMenu();
- else if (_gridSelectedApplication == null && _gridAppContextMenu != null)
- GridAppContextMenu = null!;
-#pragma warning restore MVVMTK0034
-
- OnPropertyChanged();
- }
- }
-
// Key is Title ID
public SafeDictionary LdnData = [];
@@ -182,8 +147,11 @@ namespace Ryujinx.Ava.UI.ViewModels
Applications.ToObservableChangeSet()
.Filter(Filter)
.Sort(GetComparer())
- .Bind(out _appsObservableList)
- .AsObservableList();
+ .OnItemAdded(_ => OnPropertyChanged(nameof(AppsObservableList)))
+ .OnItemRemoved(_ => OnPropertyChanged(nameof(AppsObservableList)))
+#pragma warning disable MVVMTK0034 // Event to update is fired below
+ .Bind(out _appsObservableList);
+#pragma warning restore MVVMTK0034
_rendererWaitEvent = new AutoResetEvent(false);
@@ -192,8 +160,8 @@ namespace Ryujinx.Ava.UI.ViewModels
LoadConfigurableHotKeys();
Volume = ConfigurationState.Instance.System.AudioVolume;
+ CustomVSyncInterval = ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value;
}
- CustomVSyncInterval = ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value;
}
public void Initialize(
@@ -331,6 +299,43 @@ namespace Ryujinx.Ava.UI.ViewModels
OnPropertyChanged(nameof(ShowFirmwareStatus));
}
}
+
+ public ApplicationData ListSelectedApplication
+ {
+ get => _listSelectedApplication;
+ set
+ {
+ _listSelectedApplication = value;
+
+#pragma warning disable MVVMTK0034
+ if (_listSelectedApplication != null && _listAppContextMenu == null)
+
+ ListAppContextMenu = new ApplicationContextMenu();
+ else if (_listSelectedApplication == null && _listAppContextMenu != null)
+ ListAppContextMenu = null!;
+#pragma warning restore MVVMTK0034
+
+ OnPropertyChanged();
+ }
+ }
+
+ public ApplicationData GridSelectedApplication
+ {
+ get => _gridSelectedApplication;
+ set
+ {
+ _gridSelectedApplication = value;
+
+#pragma warning disable MVVMTK0034
+ if (_gridSelectedApplication != null && _gridAppContextMenu == null)
+ GridAppContextMenu = new ApplicationContextMenu();
+ else if (_gridSelectedApplication == null && _gridAppContextMenu != null)
+ GridAppContextMenu = null!;
+#pragma warning restore MVVMTK0034
+
+ OnPropertyChanged();
+ }
+ }
public ApplicationData SelectedApplication
{
@@ -1751,7 +1756,7 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public async void ProcessTrimResult(String filename, Ryujinx.Common.Utilities.XCIFileTrimmer.OperationOutcome operationOutcome)
+ public async void ProcessTrimResult(String filename, XCIFileTrimmer.OperationOutcome operationOutcome)
{
string notifyUser = operationOutcome.ToLocalisedText();
@@ -1766,12 +1771,8 @@ namespace Ryujinx.Ava.UI.ViewModels
{
switch (operationOutcome)
{
- case Ryujinx.Common.Utilities.XCIFileTrimmer.OperationOutcome.Successful:
- if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
- {
- if (desktop.MainWindow is MainWindow mainWindow)
- mainWindow.LoadApplications();
- }
+ case XCIFileTrimmer.OperationOutcome.Successful:
+ RyujinxApp.MainWindow.LoadApplications();
break;
}
}
diff --git a/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs b/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs
index 9c26376ce..ce40ce16c 100644
--- a/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs
@@ -1,8 +1,7 @@
-using Avalonia;
using Avalonia.Collections;
-using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
+using CommunityToolkit.Mvvm.ComponentModel;
using DynamicData;
using Gommon;
using Ryujinx.Ava.Common.Locale;
@@ -18,13 +17,13 @@ using System.Linq;
namespace Ryujinx.Ava.UI.ViewModels
{
- public class ModManagerViewModel : BaseModel
+ public partial class ModManagerViewModel : BaseModel
{
private readonly string _modJsonPath;
private AvaloniaList _mods = new();
- private AvaloniaList _views = new();
- private AvaloniaList _selectedMods = new();
+ [ObservableProperty] private AvaloniaList _views = new();
+ [ObservableProperty] private AvaloniaList _selectedMods = new();
private string _search;
private readonly ulong _applicationId;
@@ -44,26 +43,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public AvaloniaList Views
- {
- get => _views;
- set
- {
- _views = value;
- OnPropertyChanged();
- }
- }
-
- public AvaloniaList SelectedMods
- {
- get => _selectedMods;
- set
- {
- _selectedMods = value;
- OnPropertyChanged();
- }
- }
-
public string Search
{
get => _search;
@@ -143,8 +122,10 @@ namespace Ryujinx.Ava.UI.ViewModels
.Filter(Filter)
.Bind(out var view).AsObservableList();
+#pragma warning disable MVVMTK0034 // Event to update is fired below
_views.Clear();
_views.AddRange(view);
+#pragma warning restore MVVMTK0034
SelectedMods = new(Views.Where(x => x.Enabled));
diff --git a/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs
index b93cdd6dc..5096a716d 100644
--- a/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs
@@ -1,9 +1,10 @@
-using Gommon;
+using CommunityToolkit.Mvvm.ComponentModel;
+using Gommon;
using Ryujinx.Ava.Utilities.Configuration;
namespace Ryujinx.Ava.UI.ViewModels
{
- public class SettingsHacksViewModel : BaseModel
+ public partial class SettingsHacksViewModel : BaseModel
{
private readonly SettingsViewModel _baseViewModel;
@@ -14,33 +15,11 @@ namespace Ryujinx.Ava.UI.ViewModels
_baseViewModel = settingsVm;
}
- private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix;
- private bool _shaderTranslationThreadSleep = ConfigurationState.Instance.Hacks.EnableShaderTranslationDelay;
+ [ObservableProperty] private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix;
+ [ObservableProperty] private bool _shaderTranslationDelayEnabled = ConfigurationState.Instance.Hacks.EnableShaderTranslationDelay;
private int _shaderTranslationSleepDelay = ConfigurationState.Instance.Hacks.ShaderTranslationDelay;
-
- public bool Xc2MenuSoftlockFixEnabled
- {
- get => _xc2MenuSoftlockFix;
- set
- {
- _xc2MenuSoftlockFix = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool ShaderTranslationDelayEnabled
- {
- get => _shaderTranslationThreadSleep;
- set
- {
- _shaderTranslationThreadSleep = value;
-
- OnPropertyChanged();
- }
- }
- public string ShaderTranslationDelayTooltipText => $"Current value: {ShaderTranslationDelay}";
+ public string ShaderTranslationDelayValueText => $"{ShaderTranslationDelay}ms";
public int ShaderTranslationDelay
{
@@ -49,7 +28,7 @@ namespace Ryujinx.Ava.UI.ViewModels
{
_shaderTranslationSleepDelay = value;
- OnPropertiesChanged(nameof(ShaderTranslationDelay), nameof(ShaderTranslationDelayTooltipText));
+ OnPropertiesChanged(nameof(ShaderTranslationDelay), nameof(ShaderTranslationDelayValueText));
}
}
diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
index a5bdd2f88..2678bbf98 100644
--- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
@@ -1,6 +1,7 @@
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Threading;
+using CommunityToolkit.Mvvm.ComponentModel;
using Gommon;
using LibHac.Tools.FsSystem;
using Ryujinx.Audio.Backends.OpenAL;
@@ -46,9 +47,9 @@ namespace Ryujinx.Ava.UI.ViewModels
private int _resolutionScale;
private int _graphicsBackendMultithreadingIndex;
private float _volume;
- private bool _isVulkanAvailable = true;
- private bool _gameDirectoryChanged;
- private bool _autoloadDirectoryChanged;
+ [ObservableProperty] private bool _isVulkanAvailable = true;
+ [ObservableProperty] private bool _gameDirectoryChanged;
+ [ObservableProperty] private bool _autoloadDirectoryChanged;
private readonly List _gpuIds = new();
private int _graphicsBackendIndex;
private int _scalingFilter;
@@ -63,7 +64,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private int _networkInterfaceIndex;
private int _multiplayerModeIndex;
private string _ldnPassphrase;
- private string _ldnServer;
+ [ObservableProperty] private string _ldnServer;
public SettingsHacksViewModel DirtyHacks { get; }
@@ -111,43 +112,10 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public bool IsVulkanAvailable
- {
- get => _isVulkanAvailable;
- set
- {
- _isVulkanAvailable = value;
-
- OnPropertyChanged();
- }
- }
-
public bool IsOpenGLAvailable => !OperatingSystem.IsMacOS();
public bool IsAppleSiliconMac => OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64;
- public bool GameDirectoryChanged
- {
- get => _gameDirectoryChanged;
- set
- {
- _gameDirectoryChanged = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool AutoloadDirectoryChanged
- {
- get => _autoloadDirectoryChanged;
- set
- {
- _autoloadDirectoryChanged = value;
-
- OnPropertyChanged();
- }
- }
-
public bool IsMacOS => OperatingSystem.IsMacOS();
public bool EnableDiscordIntegration { get; set; }
@@ -182,19 +150,12 @@ namespace Ryujinx.Ava.UI.ViewModels
_customVSyncInterval = newInterval;
_customVSyncIntervalPercentageProxy = value;
OnPropertiesChanged(
- nameof(CustomVSyncInterval),
+ nameof(CustomVSyncInterval),
nameof(CustomVSyncIntervalPercentageText));
}
}
- public string CustomVSyncIntervalPercentageText
- {
- get
- {
- string text = CustomVSyncIntervalPercentageProxy + "%";
- return text;
- }
- }
+ public string CustomVSyncIntervalPercentageText => CustomVSyncIntervalPercentageProxy + "%";
public bool EnableCustomVSyncInterval
{
@@ -356,7 +317,6 @@ namespace Ryujinx.Ava.UI.ViewModels
set
{
_networkInterfaceIndex = value != -1 ? value : 0;
- ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value = _networkInterfaces[NetworkInterfaceList[_networkInterfaceIndex]];
}
}
@@ -366,7 +326,6 @@ namespace Ryujinx.Ava.UI.ViewModels
set
{
_multiplayerModeIndex = value;
- ConfigurationState.Instance.Multiplayer.Mode.Value = (MultiplayerMode)_multiplayerModeIndex;
}
}
@@ -375,16 +334,6 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool IsInvalidLdnPassphraseVisible { get; set; }
- public string LdnServer
- {
- get => _ldnServer;
- set
- {
- _ldnServer = value;
- OnPropertyChanged();
- }
- }
-
public SettingsViewModel(VirtualFileSystem virtualFileSystem, ContentManager contentManager) : this()
{
_virtualFileSystem = virtualFileSystem;
@@ -466,11 +415,10 @@ namespace Ryujinx.Ava.UI.ViewModels
public void MatchSystemTime()
{
- var dto = DateTimeOffset.Now;
-
- CurrentDate = new DateTimeOffset(dto.Year, dto.Month, dto.Day, 0, 0, 0, dto.Offset);
+ (DateTimeOffset dto, TimeSpan timeOfDay) = DateTimeOffset.Now.Extract();
- CurrentTime = dto.TimeOfDay;
+ CurrentDate = dto;
+ CurrentTime = timeOfDay;
OnPropertyChanged(nameof(CurrentDate));
OnPropertyChanged(nameof(CurrentTime));
@@ -648,16 +596,14 @@ namespace Ryujinx.Ava.UI.ViewModels
config.ShowTitleBar.Value = ShowTitleBar;
config.HideCursor.Value = (HideCursorMode)HideCursor;
- if (_gameDirectoryChanged)
+ if (GameDirectoryChanged)
{
- List gameDirs = new(GameDirectories);
- config.UI.GameDirs.Value = gameDirs;
+ config.UI.GameDirs.Value = [..GameDirectories];
}
- if (_autoloadDirectoryChanged)
+ if (AutoloadDirectoryChanged)
{
- List autoloadDirs = new(AutoloadDirectories);
- config.UI.AutoloadDirs.Value = autoloadDirs;
+ config.UI.AutoloadDirs.Value = [..AutoloadDirectories];
}
config.UI.BaseStyle.Value = BaseStyleIndex switch
@@ -756,7 +702,7 @@ namespace Ryujinx.Ava.UI.ViewModels
config.Multiplayer.LdnServer.Value = LdnServer;
// Dirty Hacks
- config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFixEnabled;
+ config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFix;
config.Hacks.EnableShaderTranslationDelay.Value = DirtyHacks.ShaderTranslationDelayEnabled;
config.Hacks.ShaderTranslationDelay.Value = DirtyHacks.ShaderTranslationDelay;
@@ -767,8 +713,8 @@ namespace Ryujinx.Ava.UI.ViewModels
SaveSettingsEvent?.Invoke();
- _gameDirectoryChanged = false;
- _autoloadDirectoryChanged = false;
+ GameDirectoryChanged = false;
+ AutoloadDirectoryChanged = false;
}
private static void RevertIfNotSaved()
diff --git a/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs b/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs
index 0748efeb4..86d59d6b4 100644
--- a/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs
@@ -1,74 +1,32 @@
using Avalonia.Collections;
-using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
+using CommunityToolkit.Mvvm.ComponentModel;
using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Common.Models;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.Utilities.AppLibrary;
-using Ryujinx.HLE.FileSystem;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using Application = Avalonia.Application;
namespace Ryujinx.Ava.UI.ViewModels
{
- public record TitleUpdateViewNoUpdateSentinal();
+ public record TitleUpdateViewModelNoUpdate;
- public class TitleUpdateViewModel : BaseModel
+ public partial class TitleUpdateViewModel : BaseModel
{
private ApplicationLibrary ApplicationLibrary { get; }
private ApplicationData ApplicationData { get; }
- private AvaloniaList _titleUpdates = new();
- private AvaloniaList