diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index ffb5d5f8b..68be1f5e0 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -23,7 +23,7 @@ body:
attributes:
label: Log file
description: A log file will help our developers to better diagnose and fix the issue.
- placeholder: Logs files can be found under "Logs" folder in Ryujinx program folder. They can also be accessed by opening Ryujinx, then going to File > Open Logs Folder. You can drag and drop the log on to the text area (do not copy paste).
+ placeholder: Logs files can be found under "Logs" folder in Ryujinx program folder. You can drag and drop the log on to the text area
validations:
required: true
- type: input
@@ -83,4 +83,4 @@ body:
- Additional info about your environment:
- Any other information relevant to your issue.
validations:
- required: false
+ required: false
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 399aa039c..383bbb151 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -1,7 +1,6 @@
name: Feature Request
description: Suggest a new feature for Ryujinx.
title: "[Feature Request]"
-labels: enhancement
body:
- type: textarea
id: overview
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 301024cf8..d04e237e0 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -11,18 +11,18 @@
-
+
-
+
-
+
-
+
@@ -39,14 +39,14 @@
-
-
-
-
-
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/Ryujinx.sln b/Ryujinx.sln
index 76ebd573f..b8304164d 100644
--- a/Ryujinx.sln
+++ b/Ryujinx.sln
@@ -87,8 +87,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon", "src\Ryuj
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Generators", "src\Ryujinx.Horizon.Kernel.Generators\Ryujinx.Horizon.Kernel.Generators.csproj", "{7F55A45D-4E1D-4A36-ADD3-87F29A285AA2}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -251,10 +249,6 @@ Global
{7F55A45D-4E1D-4A36-ADD3-87F29A285AA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7F55A45D-4E1D-4A36-ADD3-87F29A285AA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F55A45D-4E1D-4A36-ADD3-87F29A285AA2}.Release|Any CPU.Build.0 = Release|Any CPU
- {B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs b/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs
index 89b1e9e6b..12ebabddd 100644
--- a/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs
+++ b/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs
@@ -237,7 +237,7 @@ namespace ARMeilleure.CodeGen.Arm64
long originalPosition = _stream.Position;
_stream.Seek(0, SeekOrigin.Begin);
- _stream.ReadExactly(code, 0, code.Length);
+ _stream.Read(code, 0, code.Length);
_stream.Seek(originalPosition, SeekOrigin.Begin);
RelocInfo relocInfo;
diff --git a/src/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs b/src/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs
index 16feeb914..f156e0886 100644
--- a/src/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs
+++ b/src/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs
@@ -251,20 +251,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
}
}
- // If this is a copy destination variable, we prefer the register used for the copy source.
- // If the register is available, then the copy can be eliminated later as both source
- // and destination will use the same register.
- int selectedReg;
-
- if (current.TryGetCopySourceRegister(out int preferredReg) && freePositions[preferredReg] >= current.GetEnd())
- {
- selectedReg = preferredReg;
- }
- else
- {
- selectedReg = GetHighestValueIndex(freePositions);
- }
-
+ int selectedReg = GetHighestValueIndex(freePositions);
int selectedNextUse = freePositions[selectedReg];
// Intervals starts and ends at odd positions, unless they span an entire
@@ -444,7 +431,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
}
}
- private static int GetHighestValueIndex(ReadOnlySpan span)
+ private static int GetHighestValueIndex(Span span)
{
int highest = int.MinValue;
@@ -811,12 +798,12 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
// The "visited" state is stored in the MSB of the local's value.
const ulong VisitedMask = 1ul << 63;
- static bool IsVisited(Operand local)
+ bool IsVisited(Operand local)
{
return (local.GetValueUnsafe() & VisitedMask) != 0;
}
- static void SetVisited(Operand local)
+ void SetVisited(Operand local)
{
local.GetValueUnsafe() |= VisitedMask;
}
@@ -839,25 +826,9 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
{
dest.NumberLocal(_intervals.Count);
- LiveInterval interval = new LiveInterval(dest);
- _intervals.Add(interval);
+ _intervals.Add(new LiveInterval(dest));
SetVisited(dest);
-
- // If this is a copy (or copy-like operation), set the copy source interval as well.
- // This is used for register preferencing later on, which allows the copy to be eliminated
- // in some cases.
- if (node.Instruction == Instruction.Copy || node.Instruction == Instruction.ZeroExtend32)
- {
- Operand source = node.GetSource(0);
-
- if (source.Kind == OperandKind.LocalVariable &&
- source.GetLocalNumber() > 0 &&
- (node.Instruction == Instruction.Copy || source.Type == OperandType.I32))
- {
- interval.SetCopySource(_intervals[source.GetLocalNumber()]);
- }
- }
}
}
}
diff --git a/src/ARMeilleure/CodeGen/RegisterAllocators/LiveInterval.cs b/src/ARMeilleure/CodeGen/RegisterAllocators/LiveInterval.cs
index cfe1bc7ca..333d3951b 100644
--- a/src/ARMeilleure/CodeGen/RegisterAllocators/LiveInterval.cs
+++ b/src/ARMeilleure/CodeGen/RegisterAllocators/LiveInterval.cs
@@ -19,7 +19,6 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
public LiveRange CurrRange;
public LiveInterval Parent;
- public LiveInterval CopySource;
public UseList Uses;
public LiveIntervalList Children;
@@ -38,7 +37,6 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
private ref LiveRange CurrRange => ref _data->CurrRange;
private ref LiveRange PrevRange => ref _data->PrevRange;
private ref LiveInterval Parent => ref _data->Parent;
- private ref LiveInterval CopySource => ref _data->CopySource;
private ref UseList Uses => ref _data->Uses;
private ref LiveIntervalList Children => ref _data->Children;
@@ -80,25 +78,6 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
Register = register;
}
- public void SetCopySource(LiveInterval copySource)
- {
- CopySource = copySource;
- }
-
- public bool TryGetCopySourceRegister(out int copySourceRegIndex)
- {
- if (CopySource._data != null)
- {
- copySourceRegIndex = CopySource.Register.Index;
-
- return true;
- }
-
- copySourceRegIndex = 0;
-
- return false;
- }
-
public void Reset()
{
PrevRange = default;
diff --git a/src/ARMeilleure/CodeGen/X86/Assembler.cs b/src/ARMeilleure/CodeGen/X86/Assembler.cs
index 96f4de049..55bf07248 100644
--- a/src/ARMeilleure/CodeGen/X86/Assembler.cs
+++ b/src/ARMeilleure/CodeGen/X86/Assembler.cs
@@ -1444,7 +1444,7 @@ namespace ARMeilleure.CodeGen.X86
Span buffer = new byte[jump.JumpPosition - _stream.Position];
- _stream.ReadExactly(buffer);
+ _stream.Read(buffer);
_stream.Seek(ReservedBytesForJump, SeekOrigin.Current);
codeStream.Write(buffer);
diff --git a/src/ARMeilleure/Decoders/OpCodeTable.cs b/src/ARMeilleure/Decoders/OpCodeTable.cs
index 20d567fe5..edc004125 100644
--- a/src/ARMeilleure/Decoders/OpCodeTable.cs
+++ b/src/ARMeilleure/Decoders/OpCodeTable.cs
@@ -746,7 +746,6 @@ namespace ARMeilleure.Decoders
SetA32("<<<<01101000xxxxxxxxxxxxxx01xxxx", InstName.Pkh, InstEmit32.Pkh, OpCode32AluRsImm.Create);
SetA32("11110101xx01xxxx1111xxxxxxxxxxxx", InstName.Pld, InstEmit32.Nop, OpCode32.Create);
SetA32("11110111xx01xxxx1111xxxxxxx0xxxx", InstName.Pld, InstEmit32.Nop, OpCode32.Create);
- SetA32("<<<<01100010xxxxxxxx11110001xxxx", InstName.Qadd16, InstEmit32.Qadd16, OpCode32AluReg.Create);
SetA32("<<<<011011111111xxxx11110011xxxx", InstName.Rbit, InstEmit32.Rbit, OpCode32AluReg.Create);
SetA32("<<<<011010111111xxxx11110011xxxx", InstName.Rev, InstEmit32.Rev, OpCode32AluReg.Create);
SetA32("<<<<011010111111xxxx11111011xxxx", InstName.Rev16, InstEmit32.Rev16, OpCode32AluReg.Create);
@@ -823,10 +822,6 @@ namespace ARMeilleure.Decoders
SetA32("<<<<00000100xxxxxxxxxxxx1001xxxx", InstName.Umaal, InstEmit32.Umaal, OpCode32AluUmull.Create);
SetA32("<<<<0000101xxxxxxxxxxxxx1001xxxx", InstName.Umlal, InstEmit32.Umlal, OpCode32AluUmull.Create);
SetA32("<<<<0000100xxxxxxxxxxxxx1001xxxx", InstName.Umull, InstEmit32.Umull, OpCode32AluUmull.Create);
- SetA32("<<<<01100110xxxxxxxx11110001xxxx", InstName.Uqadd16, InstEmit32.Uqadd16, OpCode32AluReg.Create);
- SetA32("<<<<01100110xxxxxxxx11111001xxxx", InstName.Uqadd8, InstEmit32.Uqadd8, OpCode32AluReg.Create);
- SetA32("<<<<01100110xxxxxxxx11110111xxxx", InstName.Uqsub16, InstEmit32.Uqsub16, OpCode32AluReg.Create);
- SetA32("<<<<01100110xxxxxxxx11111111xxxx", InstName.Uqsub8, InstEmit32.Uqsub8, OpCode32AluReg.Create);
SetA32("<<<<0110111xxxxxxxxxxxxxxx01xxxx", InstName.Usat, InstEmit32.Usat, OpCode32Sat.Create);
SetA32("<<<<01101110xxxxxxxx11110011xxxx", InstName.Usat16, InstEmit32.Usat16, OpCode32Sat16.Create);
SetA32("<<<<01100101xxxxxxxx11111111xxxx", InstName.Usub8, InstEmit32.Usub8, OpCode32AluReg.Create);
@@ -1012,8 +1007,6 @@ namespace ARMeilleure.Decoders
SetAsimd("111100100x10xxxxxxxx1011xxx0xxxx", InstName.Vqdmulh, InstEmit32.Vqdmulh, OpCode32SimdReg.Create, OpCode32SimdReg.CreateT32);
SetAsimd("111100111x11<<10xxxx00101xx0xxx0", InstName.Vqmovn, InstEmit32.Vqmovn, OpCode32SimdMovn.Create, OpCode32SimdMovn.CreateT32);
SetAsimd("111100111x11<<10xxxx001001x0xxx0", InstName.Vqmovun, InstEmit32.Vqmovun, OpCode32SimdMovn.Create, OpCode32SimdMovn.CreateT32);
- SetAsimd("111100110x01xxxxxxxx1011xxx0xxxx", InstName.Vqrdmulh, InstEmit32.Vqrdmulh, OpCode32SimdReg.Create, OpCode32SimdReg.CreateT32);
- SetAsimd("111100110x10xxxxxxxx1011xxx0xxxx", InstName.Vqrdmulh, InstEmit32.Vqrdmulh, OpCode32SimdReg.Create, OpCode32SimdReg.CreateT32);
SetAsimd("1111001x1x>>>xxxxxxx100101x1xxx0", InstName.Vqrshrn, InstEmit32.Vqrshrn, OpCode32SimdShImmNarrow.Create, OpCode32SimdShImmNarrow.CreateT32);
SetAsimd("111100111x>>>xxxxxxx100001x1xxx0", InstName.Vqrshrun, InstEmit32.Vqrshrun, OpCode32SimdShImmNarrow.Create, OpCode32SimdShImmNarrow.CreateT32);
SetAsimd("1111001x1x>>>xxxxxxx100100x1xxx0", InstName.Vqshrn, InstEmit32.Vqshrn, OpCode32SimdShImmNarrow.Create, OpCode32SimdShImmNarrow.CreateT32);
@@ -1035,10 +1028,8 @@ namespace ARMeilleure.Decoders
SetAsimd("111100101x>>>xxxxxxx0101>xx1xxxx", InstName.Vshl, InstEmit32.Vshl, OpCode32SimdShImm.Create, OpCode32SimdShImm.CreateT32);
SetAsimd("1111001x0xxxxxxxxxxx0100xxx0xxxx", InstName.Vshl, InstEmit32.Vshl_I, OpCode32SimdReg.Create, OpCode32SimdReg.CreateT32);
SetAsimd("1111001x1x>>>xxxxxxx101000x1xxxx", InstName.Vshll, InstEmit32.Vshll, OpCode32SimdShImmLong.Create, OpCode32SimdShImmLong.CreateT32); // A1 encoding.
- SetAsimd("111100111x11<<10xxxx001100x0xxxx", InstName.Vshll, InstEmit32.Vshll2, OpCode32SimdMovn.Create, OpCode32SimdMovn.CreateT32); // A2 encoding.
SetAsimd("1111001x1x>>>xxxxxxx0000>xx1xxxx", InstName.Vshr, InstEmit32.Vshr, OpCode32SimdShImm.Create, OpCode32SimdShImm.CreateT32);
SetAsimd("111100101x>>>xxxxxxx100000x1xxx0", InstName.Vshrn, InstEmit32.Vshrn, OpCode32SimdShImmNarrow.Create, OpCode32SimdShImmNarrow.CreateT32);
- SetAsimd("111100111x>>>xxxxxxx0101>xx1xxxx", InstName.Vsli, InstEmit32.Vsli_I, OpCode32SimdShImm.Create, OpCode32SimdShImm.CreateT32);
SetAsimd("1111001x1x>>>xxxxxxx0001>xx1xxxx", InstName.Vsra, InstEmit32.Vsra, OpCode32SimdShImm.Create, OpCode32SimdShImm.CreateT32);
SetAsimd("111101001x00xxxxxxxx0000xxx0xxxx", InstName.Vst1, InstEmit32.Vst1, OpCode32SimdMemSingle.Create, OpCode32SimdMemSingle.CreateT32);
SetAsimd("111101001x00xxxxxxxx0100xx0xxxxx", InstName.Vst1, InstEmit32.Vst1, OpCode32SimdMemSingle.Create, OpCode32SimdMemSingle.CreateT32);
@@ -1063,7 +1054,6 @@ namespace ARMeilleure.Decoders
SetAsimd("111100100x10xxxxxxxx1101xxx0xxxx", InstName.Vsub, InstEmit32.Vsub_V, OpCode32SimdReg.Create, OpCode32SimdReg.CreateT32);
SetAsimd("1111001x1x<
- {
- EmitSaturateRange(context, d, context.Add(n, m), 16, unsigned: false, setQ: false);
- }));
- }
-
public static void Rbit(ArmEmitterContext context)
{
Operand m = GetAluM(context);
@@ -570,46 +558,6 @@ namespace ARMeilleure.Instructions
EmitHsub8(context, unsigned: true);
}
- public static void Uqadd16(ArmEmitterContext context)
- {
- OpCode32AluReg op = (OpCode32AluReg)context.CurrOp;
-
- SetIntA32(context, op.Rd, EmitUnsigned16BitPair(context, GetIntA32(context, op.Rn), GetIntA32(context, op.Rm), (d, n, m) =>
- {
- EmitSaturateUqadd(context, d, context.Add(n, m), 16);
- }));
- }
-
- public static void Uqadd8(ArmEmitterContext context)
- {
- OpCode32AluReg op = (OpCode32AluReg)context.CurrOp;
-
- SetIntA32(context, op.Rd, EmitUnsigned8BitPair(context, GetIntA32(context, op.Rn), GetIntA32(context, op.Rm), (d, n, m) =>
- {
- EmitSaturateUqadd(context, d, context.Add(n, m), 8);
- }));
- }
-
- public static void Uqsub16(ArmEmitterContext context)
- {
- OpCode32AluReg op = (OpCode32AluReg)context.CurrOp;
-
- SetIntA32(context, op.Rd, EmitUnsigned16BitPair(context, GetIntA32(context, op.Rn), GetIntA32(context, op.Rm), (d, n, m) =>
- {
- EmitSaturateUqsub(context, d, context.Subtract(n, m), 16);
- }));
- }
-
- public static void Uqsub8(ArmEmitterContext context)
- {
- OpCode32AluReg op = (OpCode32AluReg)context.CurrOp;
-
- SetIntA32(context, op.Rd, EmitUnsigned8BitPair(context, GetIntA32(context, op.Rn), GetIntA32(context, op.Rm), (d, n, m) =>
- {
- EmitSaturateUqsub(context, d, context.Subtract(n, m), 8);
- }));
- }
-
public static void Usat(ArmEmitterContext context)
{
OpCode32Sat op = (OpCode32Sat)context.CurrOp;
@@ -986,251 +934,6 @@ namespace ARMeilleure.Instructions
}
}
- private static void EmitSaturateRange(ArmEmitterContext context, Operand result, Operand value, uint saturateTo, bool unsigned, bool setQ = true)
- {
- Debug.Assert(saturateTo <= 32);
- Debug.Assert(!unsigned || saturateTo < 32);
-
- if (!unsigned && saturateTo == 32)
- {
- // No saturation possible for this case.
-
- context.Copy(result, value);
-
- return;
- }
- else if (saturateTo == 0)
- {
- // Result is always zero if we saturate 0 bits.
-
- context.Copy(result, Const(0));
-
- return;
- }
-
- Operand satValue;
-
- if (unsigned)
- {
- // Negative values always saturate (to zero).
- // So we must always ignore the sign bit when masking, so that the truncated value will differ from the original one.
-
- satValue = context.BitwiseAnd(value, Const((int)(uint.MaxValue >> (32 - (int)saturateTo))));
- }
- else
- {
- satValue = context.ShiftLeft(value, Const(32 - (int)saturateTo));
- satValue = context.ShiftRightSI(satValue, Const(32 - (int)saturateTo));
- }
-
- // If the result is 0, the values are equal and we don't need saturation.
- Operand lblNoSat = Label();
- context.BranchIfFalse(lblNoSat, context.Subtract(value, satValue));
-
- // Saturate and set Q flag.
- if (unsigned)
- {
- if (saturateTo == 31)
- {
- // Only saturation case possible when going from 32 bits signed to 32 or 31 bits unsigned
- // is when the signed input is negative, as all positive values are representable on a 31 bits range.
-
- satValue = Const(0);
- }
- else
- {
- satValue = context.ShiftRightSI(value, Const(31));
- satValue = context.BitwiseNot(satValue);
- satValue = context.ShiftRightUI(satValue, Const(32 - (int)saturateTo));
- }
- }
- else
- {
- if (saturateTo == 1)
- {
- satValue = context.ShiftRightSI(value, Const(31));
- }
- else
- {
- satValue = Const(uint.MaxValue >> (33 - (int)saturateTo));
- satValue = context.BitwiseExclusiveOr(satValue, context.ShiftRightSI(value, Const(31)));
- }
- }
-
- if (setQ)
- {
- SetFlag(context, PState.QFlag, Const(1));
- }
-
- context.Copy(result, satValue);
-
- Operand lblExit = Label();
- context.Branch(lblExit);
-
- context.MarkLabel(lblNoSat);
-
- context.Copy(result, value);
-
- context.MarkLabel(lblExit);
- }
-
- private static void EmitSaturateUqadd(ArmEmitterContext context, Operand result, Operand value, uint saturateTo)
- {
- Debug.Assert(saturateTo <= 32);
-
- if (saturateTo == 32)
- {
- // No saturation possible for this case.
-
- context.Copy(result, value);
-
- return;
- }
- else if (saturateTo == 0)
- {
- // Result is always zero if we saturate 0 bits.
-
- context.Copy(result, Const(0));
-
- return;
- }
-
- // If the result is 0, the values are equal and we don't need saturation.
- Operand lblNoSat = Label();
- context.BranchIfFalse(lblNoSat, context.ShiftRightUI(value, Const((int)saturateTo)));
-
- // Saturate.
- context.Copy(result, Const(uint.MaxValue >> (32 - (int)saturateTo)));
-
- Operand lblExit = Label();
- context.Branch(lblExit);
-
- context.MarkLabel(lblNoSat);
-
- context.Copy(result, value);
-
- context.MarkLabel(lblExit);
- }
-
- private static void EmitSaturateUqsub(ArmEmitterContext context, Operand result, Operand value, uint saturateTo)
- {
- Debug.Assert(saturateTo <= 32);
-
- if (saturateTo == 32)
- {
- // No saturation possible for this case.
-
- context.Copy(result, value);
-
- return;
- }
- else if (saturateTo == 0)
- {
- // Result is always zero if we saturate 0 bits.
-
- context.Copy(result, Const(0));
-
- return;
- }
-
- // If the result is 0, the values are equal and we don't need saturation.
- Operand lblNoSat = Label();
- context.BranchIf(lblNoSat, value, Const(0), Comparison.GreaterOrEqual);
-
- // Saturate.
- // Assumes that the value can only underflow, since this is only used for unsigned subtraction.
- context.Copy(result, Const(0));
-
- Operand lblExit = Label();
- context.Branch(lblExit);
-
- context.MarkLabel(lblNoSat);
-
- context.Copy(result, value);
-
- context.MarkLabel(lblExit);
- }
-
- private static Operand EmitSigned16BitPair(ArmEmitterContext context, Operand rn, Operand rm, Action elementAction)
- {
- Operand tempD = context.AllocateLocal(OperandType.I32);
-
- Operand tempN = context.SignExtend16(OperandType.I32, rn);
- Operand tempM = context.SignExtend16(OperandType.I32, rm);
- elementAction(tempD, tempN, tempM);
- Operand tempD2 = context.ZeroExtend16(OperandType.I32, tempD);
-
- tempN = context.ShiftRightSI(rn, Const(16));
- tempM = context.ShiftRightSI(rm, Const(16));
- elementAction(tempD, tempN, tempM);
- return context.BitwiseOr(tempD2, context.ShiftLeft(tempD, Const(16)));
- }
-
- private static Operand EmitUnsigned16BitPair(ArmEmitterContext context, Operand rn, Operand rm, Action elementAction)
- {
- Operand tempD = context.AllocateLocal(OperandType.I32);
-
- Operand tempN = context.ZeroExtend16(OperandType.I32, rn);
- Operand tempM = context.ZeroExtend16(OperandType.I32, rm);
- elementAction(tempD, tempN, tempM);
- Operand tempD2 = context.ZeroExtend16(OperandType.I32, tempD);
-
- tempN = context.ShiftRightUI(rn, Const(16));
- tempM = context.ShiftRightUI(rm, Const(16));
- elementAction(tempD, tempN, tempM);
- return context.BitwiseOr(tempD2, context.ShiftLeft(tempD, Const(16)));
- }
-
- private static Operand EmitSigned8BitPair(ArmEmitterContext context, Operand rn, Operand rm, Action elementAction)
- {
- return Emit8BitPair(context, rn, rm, elementAction, unsigned: false);
- }
-
- private static Operand EmitUnsigned8BitPair(ArmEmitterContext context, Operand rn, Operand rm, Action elementAction)
- {
- return Emit8BitPair(context, rn, rm, elementAction, unsigned: true);
- }
-
- private static Operand Emit8BitPair(ArmEmitterContext context, Operand rn, Operand rm, Action elementAction, bool unsigned)
- {
- Operand tempD = context.AllocateLocal(OperandType.I32);
- Operand result = default;
-
- for (int b = 0; b < 4; b++)
- {
- Operand nByte = b != 0 ? context.ShiftRightUI(rn, Const(b * 8)) : rn;
- Operand mByte = b != 0 ? context.ShiftRightUI(rm, Const(b * 8)) : rm;
-
- if (unsigned)
- {
- nByte = context.ZeroExtend8(OperandType.I32, nByte);
- mByte = context.ZeroExtend8(OperandType.I32, mByte);
- }
- else
- {
- nByte = context.SignExtend8(OperandType.I32, nByte);
- mByte = context.SignExtend8(OperandType.I32, mByte);
- }
-
- elementAction(tempD, nByte, mByte);
-
- if (b == 0)
- {
- result = context.ZeroExtend8(OperandType.I32, tempD);
- }
- else if (b < 3)
- {
- result = context.BitwiseOr(result, context.ShiftLeft(context.ZeroExtend8(OperandType.I32, tempD), Const(b * 8)));
- }
- else
- {
- result = context.BitwiseOr(result, context.ShiftLeft(tempD, Const(24)));
- }
- }
-
- return result;
- }
-
private static void EmitAluStore(ArmEmitterContext context, Operand value)
{
IOpCode32Alu op = (IOpCode32Alu)context.CurrOp;
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
index c807fc858..dc2646a55 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs
@@ -1246,33 +1246,6 @@ namespace ARMeilleure.Instructions
EmitVectorUnaryNarrowOp32(context, (op1) => EmitSatQ(context, op1, 8 << op.Size, signedSrc: true, signedDst: false), signed: true);
}
- public static void Vqrdmulh(ArmEmitterContext context)
- {
- OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp;
- int eSize = 8 << op.Size;
-
- EmitVectorBinaryOpI32(context, (op1, op2) =>
- {
- if (op.Size == 2)
- {
- op1 = context.SignExtend32(OperandType.I64, op1);
- op2 = context.SignExtend32(OperandType.I64, op2);
- }
-
- Operand res = context.Multiply(op1, op2);
- res = context.Add(res, Const(res.Type, 1L << (eSize - 2)));
- res = context.ShiftRightSI(res, Const(eSize - 1));
- res = EmitSatQ(context, res, eSize, signedSrc: true, signedDst: true);
-
- if (op.Size == 2)
- {
- res = context.ConvertI64ToI32(res);
- }
-
- return res;
- }, signed: true);
- }
-
public static void Vqsub(ArmEmitterContext context)
{
OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp;
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdMove32.cs b/src/ARMeilleure/Instructions/InstEmitSimdMove32.cs
index fb2641f66..9fa740997 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdMove32.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdMove32.cs
@@ -191,26 +191,6 @@ namespace ARMeilleure.Instructions
context.Copy(GetVecA32(op.Qd), res);
}
- public static void Vswp(ArmEmitterContext context)
- {
- OpCode32Simd op = (OpCode32Simd)context.CurrOp;
-
- if (op.Q)
- {
- Operand temp = context.Copy(GetVecA32(op.Qd));
-
- context.Copy(GetVecA32(op.Qd), GetVecA32(op.Qm));
- context.Copy(GetVecA32(op.Qm), temp);
- }
- else
- {
- Operand temp = ExtractScalar(context, OperandType.I64, op.Vd);
-
- InsertScalar(context, op.Vd, ExtractScalar(context, OperandType.I64, op.Vm));
- InsertScalar(context, op.Vm, temp);
- }
- }
-
public static void Vtbl(ArmEmitterContext context)
{
OpCode32SimdTbl op = (OpCode32SimdTbl)context.CurrOp;
diff --git a/src/ARMeilleure/Instructions/InstEmitSimdShift32.cs b/src/ARMeilleure/Instructions/InstEmitSimdShift32.cs
index eb28a0c5a..e40600a47 100644
--- a/src/ARMeilleure/Instructions/InstEmitSimdShift32.cs
+++ b/src/ARMeilleure/Instructions/InstEmitSimdShift32.cs
@@ -106,38 +106,6 @@ namespace ARMeilleure.Instructions
context.Copy(GetVecA32(op.Qd), res);
}
- public static void Vshll2(ArmEmitterContext context)
- {
- OpCode32Simd op = (OpCode32Simd)context.CurrOp;
-
- Operand res = context.VectorZero();
-
- int elems = op.GetBytesCount() >> op.Size;
-
- for (int index = 0; index < elems; index++)
- {
- Operand me = EmitVectorExtract32(context, op.Qm, op.Im + index, op.Size, !op.U);
-
- if (op.Size == 2)
- {
- if (op.U)
- {
- me = context.ZeroExtend32(OperandType.I64, me);
- }
- else
- {
- me = context.SignExtend32(OperandType.I64, me);
- }
- }
-
- me = context.ShiftLeft(me, Const(8 << op.Size));
-
- res = EmitVectorInsert(context, res, me, index, op.Size + 1);
- }
-
- context.Copy(GetVecA32(op.Qd), res);
- }
-
public static void Vshr(ArmEmitterContext context)
{
OpCode32SimdShImm op = (OpCode32SimdShImm)context.CurrOp;
@@ -162,36 +130,6 @@ namespace ARMeilleure.Instructions
EmitVectorUnaryNarrowOp32(context, (op1) => context.ShiftRightUI(op1, Const(shift)));
}
- public static void Vsli_I(ArmEmitterContext context)
- {
- OpCode32SimdShImm op = (OpCode32SimdShImm)context.CurrOp;
- int shift = op.Shift;
- int eSize = 8 << op.Size;
-
- ulong mask = shift != 0 ? ulong.MaxValue >> (64 - shift) : 0UL;
-
- Operand res = GetVec(op.Qd);
-
- int elems = op.GetBytesCount() >> op.Size;
-
- for (int index = 0; index < elems; index++)
- {
- Operand me = EmitVectorExtractZx(context, op.Qm, op.Im + index, op.Size);
-
- Operand neShifted = context.ShiftLeft(me, Const(shift));
-
- Operand de = EmitVectorExtractZx(context, op.Qd, op.Id + index, op.Size);
-
- Operand deMasked = context.BitwiseAnd(de, Const(mask));
-
- Operand e = context.BitwiseOr(neShifted, deMasked);
-
- res = EmitVectorInsert(context, res, e, op.Id + index, op.Size);
- }
-
- context.Copy(GetVec(op.Qd), res);
- }
-
public static void Vsra(ArmEmitterContext context)
{
OpCode32SimdShImm op = (OpCode32SimdShImm)context.CurrOp;
diff --git a/src/ARMeilleure/Instructions/InstName.cs b/src/ARMeilleure/Instructions/InstName.cs
index 74c33155b..457abbf49 100644
--- a/src/ARMeilleure/Instructions/InstName.cs
+++ b/src/ARMeilleure/Instructions/InstName.cs
@@ -527,7 +527,6 @@ namespace ARMeilleure.Instructions
Pld,
Pop,
Push,
- Qadd16,
Rev,
Revsh,
Rsb,
@@ -572,10 +571,6 @@ namespace ARMeilleure.Instructions
Umaal,
Umlal,
Umull,
- Uqadd16,
- Uqadd8,
- Uqsub16,
- Uqsub8,
Usat,
Usat16,
Usub8,
@@ -650,7 +645,6 @@ namespace ARMeilleure.Instructions
Vqdmulh,
Vqmovn,
Vqmovun,
- Vqrdmulh,
Vqrshrn,
Vqrshrun,
Vqshrn,
@@ -672,7 +666,6 @@ namespace ARMeilleure.Instructions
Vshll,
Vshr,
Vshrn,
- Vsli,
Vst1,
Vst2,
Vst3,
@@ -689,7 +682,6 @@ namespace ARMeilleure.Instructions
Vsub,
Vsubl,
Vsubw,
- Vswp,
Vtbl,
Vtrn,
Vtst,
diff --git a/src/ARMeilleure/Translation/ControlFlowGraph.cs b/src/ARMeilleure/Translation/ControlFlowGraph.cs
index 45b092ec5..3ead49c93 100644
--- a/src/ARMeilleure/Translation/ControlFlowGraph.cs
+++ b/src/ARMeilleure/Translation/ControlFlowGraph.cs
@@ -11,7 +11,7 @@ namespace ARMeilleure.Translation
private int[] _postOrderMap;
public int LocalsCount { get; private set; }
- public BasicBlock Entry { get; private set; }
+ public BasicBlock Entry { get; }
public IntrusiveList Blocks { get; }
public BasicBlock[] PostOrderBlocks => _postOrderBlocks;
public int[] PostOrderMap => _postOrderMap;
@@ -34,15 +34,6 @@ namespace ARMeilleure.Translation
return result;
}
- public void UpdateEntry(BasicBlock newEntry)
- {
- newEntry.AddSuccessor(Entry);
-
- Entry = newEntry;
- Blocks.AddFirst(newEntry);
- Update();
- }
-
public void Update()
{
RemoveUnreachableBlocks(Blocks);
diff --git a/src/ARMeilleure/Translation/DelegateInfo.cs b/src/ARMeilleure/Translation/DelegateInfo.cs
index 706625437..27479a003 100644
--- a/src/ARMeilleure/Translation/DelegateInfo.cs
+++ b/src/ARMeilleure/Translation/DelegateInfo.cs
@@ -1,4 +1,5 @@
using System;
+using System.Runtime.InteropServices;
namespace ARMeilleure.Translation
{
@@ -10,10 +11,11 @@ namespace ARMeilleure.Translation
public IntPtr FuncPtr { get; }
- public DelegateInfo(Delegate dlg, IntPtr funcPtr)
+ public DelegateInfo(Delegate dlg)
{
_dlg = dlg;
- FuncPtr = funcPtr;
+
+ FuncPtr = Marshal.GetFunctionPointerForDelegate(dlg);
}
}
}
diff --git a/src/ARMeilleure/Translation/Delegates.cs b/src/ARMeilleure/Translation/Delegates.cs
index 66412b8e6..63db789df 100644
--- a/src/ARMeilleure/Translation/Delegates.cs
+++ b/src/ARMeilleure/Translation/Delegates.cs
@@ -3,7 +3,6 @@ using ARMeilleure.State;
using System;
using System.Collections.Generic;
using System.Reflection;
-using System.Runtime.InteropServices;
namespace ARMeilleure.Translation
{
@@ -65,11 +64,11 @@ namespace ARMeilleure.Translation
return index;
}
- private static void SetDelegateInfo(Delegate dlg, IntPtr funcPtr)
+ private static void SetDelegateInfo(Delegate dlg)
{
string key = GetKey(dlg.Method);
- _delegates.Add(key, new DelegateInfo(dlg, funcPtr)); // ArgumentException (key).
+ _delegates.Add(key, new DelegateInfo(dlg)); // ArgumentException (key).
}
private static string GetKey(MethodInfo info)
@@ -83,353 +82,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(new MathAbs(Math.Abs));
+ SetDelegateInfo(new MathCeiling(Math.Ceiling));
+ SetDelegateInfo(new MathFloor(Math.Floor));
+ SetDelegateInfo(new MathRound(Math.Round));
+ SetDelegateInfo(new MathTruncate(Math.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(new MathFAbs(MathF.Abs));
+ SetDelegateInfo(new MathFCeiling(MathF.Ceiling));
+ SetDelegateInfo(new MathFFloor(MathF.Floor));
+ SetDelegateInfo(new MathFRound(MathF.Round));
+ SetDelegateInfo(new MathFTruncate(MathF.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(new NativeInterfaceBreak(NativeInterface.Break));
+ SetDelegateInfo(new NativeInterfaceCheckSynchronization(NativeInterface.CheckSynchronization));
+ SetDelegateInfo(new NativeInterfaceEnqueueForRejit(NativeInterface.EnqueueForRejit));
+ SetDelegateInfo(new NativeInterfaceGetCntfrqEl0(NativeInterface.GetCntfrqEl0));
+ SetDelegateInfo(new NativeInterfaceGetCntpctEl0(NativeInterface.GetCntpctEl0));
+ SetDelegateInfo(new NativeInterfaceGetCntvctEl0(NativeInterface.GetCntvctEl0));
+ SetDelegateInfo(new NativeInterfaceGetCtrEl0(NativeInterface.GetCtrEl0));
+ SetDelegateInfo(new NativeInterfaceGetDczidEl0(NativeInterface.GetDczidEl0));
+ SetDelegateInfo(new NativeInterfaceGetFunctionAddress(NativeInterface.GetFunctionAddress));
+ SetDelegateInfo(new NativeInterfaceInvalidateCacheLine(NativeInterface.InvalidateCacheLine));
+ SetDelegateInfo(new NativeInterfaceReadByte(NativeInterface.ReadByte));
+ SetDelegateInfo(new NativeInterfaceReadUInt16(NativeInterface.ReadUInt16));
+ SetDelegateInfo(new NativeInterfaceReadUInt32(NativeInterface.ReadUInt32));
+ SetDelegateInfo(new NativeInterfaceReadUInt64(NativeInterface.ReadUInt64));
+ SetDelegateInfo(new NativeInterfaceReadVector128(NativeInterface.ReadVector128));
+ SetDelegateInfo(new NativeInterfaceSignalMemoryTracking(NativeInterface.SignalMemoryTracking));
+ SetDelegateInfo(new NativeInterfaceSupervisorCall(NativeInterface.SupervisorCall));
+ SetDelegateInfo(new NativeInterfaceThrowInvalidMemoryAccess(NativeInterface.ThrowInvalidMemoryAccess));
+ SetDelegateInfo(new NativeInterfaceUndefined(NativeInterface.Undefined));
+ SetDelegateInfo(new NativeInterfaceWriteByte(NativeInterface.WriteByte));
+ SetDelegateInfo(new NativeInterfaceWriteUInt16(NativeInterface.WriteUInt16));
+ SetDelegateInfo(new NativeInterfaceWriteUInt32(NativeInterface.WriteUInt32));
+ SetDelegateInfo(new NativeInterfaceWriteUInt64(NativeInterface.WriteUInt64));
+ SetDelegateInfo(new NativeInterfaceWriteVector128(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(new SoftFallbackCountLeadingSigns(SoftFallback.CountLeadingSigns));
+ SetDelegateInfo(new SoftFallbackCountLeadingZeros(SoftFallback.CountLeadingZeros));
+ SetDelegateInfo(new SoftFallbackCrc32b(SoftFallback.Crc32b));
+ SetDelegateInfo(new SoftFallbackCrc32cb(SoftFallback.Crc32cb));
+ SetDelegateInfo(new SoftFallbackCrc32ch(SoftFallback.Crc32ch));
+ SetDelegateInfo(new SoftFallbackCrc32cw(SoftFallback.Crc32cw));
+ SetDelegateInfo(new SoftFallbackCrc32cx(SoftFallback.Crc32cx));
+ SetDelegateInfo(new SoftFallbackCrc32h(SoftFallback.Crc32h));
+ SetDelegateInfo(new SoftFallbackCrc32w(SoftFallback.Crc32w));
+ SetDelegateInfo(new SoftFallbackCrc32x(SoftFallback.Crc32x));
+ SetDelegateInfo(new SoftFallbackDecrypt(SoftFallback.Decrypt));
+ SetDelegateInfo(new SoftFallbackEncrypt(SoftFallback.Encrypt));
+ SetDelegateInfo(new SoftFallbackFixedRotate(SoftFallback.FixedRotate));
+ SetDelegateInfo(new SoftFallbackHashChoose(SoftFallback.HashChoose));
+ SetDelegateInfo(new SoftFallbackHashLower(SoftFallback.HashLower));
+ SetDelegateInfo(new SoftFallbackHashMajority(SoftFallback.HashMajority));
+ SetDelegateInfo(new SoftFallbackHashParity(SoftFallback.HashParity));
+ SetDelegateInfo(new SoftFallbackHashUpper(SoftFallback.HashUpper));
+ SetDelegateInfo(new SoftFallbackInverseMixColumns(SoftFallback.InverseMixColumns));
+ SetDelegateInfo(new SoftFallbackMixColumns(SoftFallback.MixColumns));
+ SetDelegateInfo(new SoftFallbackPolynomialMult64_128(SoftFallback.PolynomialMult64_128));
+ SetDelegateInfo(new SoftFallbackSatF32ToS32(SoftFallback.SatF32ToS32));
+ SetDelegateInfo(new SoftFallbackSatF32ToS64(SoftFallback.SatF32ToS64));
+ SetDelegateInfo(new SoftFallbackSatF32ToU32(SoftFallback.SatF32ToU32));
+ SetDelegateInfo(new SoftFallbackSatF32ToU64(SoftFallback.SatF32ToU64));
+ SetDelegateInfo(new SoftFallbackSatF64ToS32(SoftFallback.SatF64ToS32));
+ SetDelegateInfo(new SoftFallbackSatF64ToS64(SoftFallback.SatF64ToS64));
+ SetDelegateInfo(new SoftFallbackSatF64ToU32(SoftFallback.SatF64ToU32));
+ SetDelegateInfo(new SoftFallbackSatF64ToU64(SoftFallback.SatF64ToU64));
+ SetDelegateInfo(new SoftFallbackSha1SchedulePart1(SoftFallback.Sha1SchedulePart1));
+ SetDelegateInfo(new SoftFallbackSha1SchedulePart2(SoftFallback.Sha1SchedulePart2));
+ SetDelegateInfo(new SoftFallbackSha256SchedulePart1(SoftFallback.Sha256SchedulePart1));
+ SetDelegateInfo(new SoftFallbackSha256SchedulePart2(SoftFallback.Sha256SchedulePart2));
+ SetDelegateInfo(new SoftFallbackSignedShrImm64(SoftFallback.SignedShrImm64));
+ SetDelegateInfo(new SoftFallbackTbl1(SoftFallback.Tbl1));
+ SetDelegateInfo(new SoftFallbackTbl2(SoftFallback.Tbl2));
+ SetDelegateInfo(new SoftFallbackTbl3(SoftFallback.Tbl3));
+ SetDelegateInfo(new SoftFallbackTbl4(SoftFallback.Tbl4));
+ SetDelegateInfo(new SoftFallbackTbx1(SoftFallback.Tbx1));
+ SetDelegateInfo(new SoftFallbackTbx2(SoftFallback.Tbx2));
+ SetDelegateInfo(new SoftFallbackTbx3(SoftFallback.Tbx3));
+ SetDelegateInfo(new SoftFallbackTbx4(SoftFallback.Tbx4));
+ SetDelegateInfo(new SoftFallbackUnsignedShrImm64(SoftFallback.UnsignedShrImm64));
- var dlgSoftFloat16_32FPConvert = new SoftFloat16_32FPConvert(SoftFloat16_32.FPConvert);
- var dlgSoftFloat16_64FPConvert = new SoftFloat16_64FPConvert(SoftFloat16_64.FPConvert);
+ SetDelegateInfo(new SoftFloat16_32FPConvert(SoftFloat16_32.FPConvert));
+ SetDelegateInfo(new SoftFloat16_64FPConvert(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(new SoftFloat32FPAdd(SoftFloat32.FPAdd));
+ SetDelegateInfo(new SoftFloat32FPAddFpscr(SoftFloat32.FPAddFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPCompare(SoftFloat32.FPCompare));
+ SetDelegateInfo(new SoftFloat32FPCompareEQ(SoftFloat32.FPCompareEQ));
+ SetDelegateInfo(new SoftFloat32FPCompareEQFpscr(SoftFloat32.FPCompareEQFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPCompareGE(SoftFloat32.FPCompareGE));
+ SetDelegateInfo(new SoftFloat32FPCompareGEFpscr(SoftFloat32.FPCompareGEFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPCompareGT(SoftFloat32.FPCompareGT));
+ SetDelegateInfo(new SoftFloat32FPCompareGTFpscr(SoftFloat32.FPCompareGTFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPCompareLE(SoftFloat32.FPCompareLE));
+ SetDelegateInfo(new SoftFloat32FPCompareLEFpscr(SoftFloat32.FPCompareLEFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPCompareLT(SoftFloat32.FPCompareLT));
+ SetDelegateInfo(new SoftFloat32FPCompareLTFpscr(SoftFloat32.FPCompareLTFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPDiv(SoftFloat32.FPDiv));
+ SetDelegateInfo(new SoftFloat32FPMax(SoftFloat32.FPMax));
+ SetDelegateInfo(new SoftFloat32FPMaxFpscr(SoftFloat32.FPMaxFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPMaxNum(SoftFloat32.FPMaxNum));
+ SetDelegateInfo(new SoftFloat32FPMaxNumFpscr(SoftFloat32.FPMaxNumFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPMin(SoftFloat32.FPMin));
+ SetDelegateInfo(new SoftFloat32FPMinFpscr(SoftFloat32.FPMinFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPMinNum(SoftFloat32.FPMinNum));
+ SetDelegateInfo(new SoftFloat32FPMinNumFpscr(SoftFloat32.FPMinNumFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPMul(SoftFloat32.FPMul));
+ SetDelegateInfo(new SoftFloat32FPMulFpscr(SoftFloat32.FPMulFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPMulAdd(SoftFloat32.FPMulAdd));
+ SetDelegateInfo(new SoftFloat32FPMulAddFpscr(SoftFloat32.FPMulAddFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPMulSub(SoftFloat32.FPMulSub));
+ SetDelegateInfo(new SoftFloat32FPMulSubFpscr(SoftFloat32.FPMulSubFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPMulX(SoftFloat32.FPMulX));
+ SetDelegateInfo(new SoftFloat32FPNegMulAdd(SoftFloat32.FPNegMulAdd));
+ SetDelegateInfo(new SoftFloat32FPNegMulSub(SoftFloat32.FPNegMulSub));
+ SetDelegateInfo(new SoftFloat32FPRecipEstimate(SoftFloat32.FPRecipEstimate));
+ SetDelegateInfo(new SoftFloat32FPRecipEstimateFpscr(SoftFloat32.FPRecipEstimateFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPRecipStep(SoftFloat32.FPRecipStep)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPRecipStepFused(SoftFloat32.FPRecipStepFused));
+ SetDelegateInfo(new SoftFloat32FPRecpX(SoftFloat32.FPRecpX));
+ SetDelegateInfo(new SoftFloat32FPRSqrtEstimate(SoftFloat32.FPRSqrtEstimate));
+ SetDelegateInfo(new SoftFloat32FPRSqrtEstimateFpscr(SoftFloat32.FPRSqrtEstimateFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPRSqrtStep(SoftFloat32.FPRSqrtStep)); // A32 only.
+ SetDelegateInfo(new SoftFloat32FPRSqrtStepFused(SoftFloat32.FPRSqrtStepFused));
+ SetDelegateInfo(new SoftFloat32FPSqrt(SoftFloat32.FPSqrt));
+ SetDelegateInfo(new SoftFloat32FPSub(SoftFloat32.FPSub));
- var dlgSoftFloat32_16FPConvert = new SoftFloat32_16FPConvert(SoftFloat32_16.FPConvert);
+ SetDelegateInfo(new SoftFloat32_16FPConvert(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(new SoftFloat64FPAdd(SoftFloat64.FPAdd));
+ SetDelegateInfo(new SoftFloat64FPAddFpscr(SoftFloat64.FPAddFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPCompare(SoftFloat64.FPCompare));
+ SetDelegateInfo(new SoftFloat64FPCompareEQ(SoftFloat64.FPCompareEQ));
+ SetDelegateInfo(new SoftFloat64FPCompareEQFpscr(SoftFloat64.FPCompareEQFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPCompareGE(SoftFloat64.FPCompareGE));
+ SetDelegateInfo(new SoftFloat64FPCompareGEFpscr(SoftFloat64.FPCompareGEFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPCompareGT(SoftFloat64.FPCompareGT));
+ SetDelegateInfo(new SoftFloat64FPCompareGTFpscr(SoftFloat64.FPCompareGTFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPCompareLE(SoftFloat64.FPCompareLE));
+ SetDelegateInfo(new SoftFloat64FPCompareLEFpscr(SoftFloat64.FPCompareLEFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPCompareLT(SoftFloat64.FPCompareLT));
+ SetDelegateInfo(new SoftFloat64FPCompareLTFpscr(SoftFloat64.FPCompareLTFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPDiv(SoftFloat64.FPDiv));
+ SetDelegateInfo(new SoftFloat64FPMax(SoftFloat64.FPMax));
+ SetDelegateInfo(new SoftFloat64FPMaxFpscr(SoftFloat64.FPMaxFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPMaxNum(SoftFloat64.FPMaxNum));
+ SetDelegateInfo(new SoftFloat64FPMaxNumFpscr(SoftFloat64.FPMaxNumFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPMin(SoftFloat64.FPMin));
+ SetDelegateInfo(new SoftFloat64FPMinFpscr(SoftFloat64.FPMinFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPMinNum(SoftFloat64.FPMinNum));
+ SetDelegateInfo(new SoftFloat64FPMinNumFpscr(SoftFloat64.FPMinNumFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPMul(SoftFloat64.FPMul));
+ SetDelegateInfo(new SoftFloat64FPMulFpscr(SoftFloat64.FPMulFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPMulAdd(SoftFloat64.FPMulAdd));
+ SetDelegateInfo(new SoftFloat64FPMulAddFpscr(SoftFloat64.FPMulAddFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPMulSub(SoftFloat64.FPMulSub));
+ SetDelegateInfo(new SoftFloat64FPMulSubFpscr(SoftFloat64.FPMulSubFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPMulX(SoftFloat64.FPMulX));
+ SetDelegateInfo(new SoftFloat64FPNegMulAdd(SoftFloat64.FPNegMulAdd));
+ SetDelegateInfo(new SoftFloat64FPNegMulSub(SoftFloat64.FPNegMulSub));
+ SetDelegateInfo(new SoftFloat64FPRecipEstimate(SoftFloat64.FPRecipEstimate));
+ SetDelegateInfo(new SoftFloat64FPRecipEstimateFpscr(SoftFloat64.FPRecipEstimateFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPRecipStep(SoftFloat64.FPRecipStep)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPRecipStepFused(SoftFloat64.FPRecipStepFused));
+ SetDelegateInfo(new SoftFloat64FPRecpX(SoftFloat64.FPRecpX));
+ SetDelegateInfo(new SoftFloat64FPRSqrtEstimate(SoftFloat64.FPRSqrtEstimate));
+ SetDelegateInfo(new SoftFloat64FPRSqrtEstimateFpscr(SoftFloat64.FPRSqrtEstimateFpscr)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPRSqrtStep(SoftFloat64.FPRSqrtStep)); // A32 only.
+ SetDelegateInfo(new SoftFloat64FPRSqrtStepFused(SoftFloat64.FPRSqrtStepFused));
+ SetDelegateInfo(new SoftFloat64FPSqrt(SoftFloat64.FPSqrt));
+ SetDelegateInfo(new SoftFloat64FPSub(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(new SoftFloat64_16FPConvert(SoftFloat64_16.FPConvert));
}
private delegate double MathAbs(double value);
diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs
index c2eed7a55..f56bdce1c 100644
--- a/src/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/src/ARMeilleure/Translation/PTC/Ptc.cs
@@ -29,7 +29,7 @@ namespace ARMeilleure.Translation.PTC
private const string OuterHeaderMagicString = "PTCohd\0\0";
private const string InnerHeaderMagicString = "PTCihd\0\0";
- private const uint InternalVersion = 6950; //! To be incremented manually for each change to the ARMeilleure project.
+ private const uint InternalVersion = 6634; //! 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/ARMeilleure/Translation/RegisterUsage.cs b/src/ARMeilleure/Translation/RegisterUsage.cs
index 472b0f67b..c8c250626 100644
--- a/src/ARMeilleure/Translation/RegisterUsage.cs
+++ b/src/ARMeilleure/Translation/RegisterUsage.cs
@@ -89,17 +89,6 @@ namespace ARMeilleure.Translation
public static void RunPass(ControlFlowGraph cfg, ExecutionMode mode)
{
- if (cfg.Entry.Predecessors.Count != 0)
- {
- // We expect the entry block to have no predecessors.
- // This is required because we have a implicit context load at the start of the function,
- // but if there is a jump to the start of the function, the context load would trash the modified values.
- // Here we insert a new entry block that will jump to the existing entry block.
- BasicBlock newEntry = new BasicBlock(cfg.Blocks.Count);
-
- cfg.UpdateEntry(newEntry);
- }
-
// Compute local register inputs and outputs used inside blocks.
RegisterMask[] localInputs = new RegisterMask[cfg.Blocks.Count];
RegisterMask[] localOutputs = new RegisterMask[cfg.Blocks.Count];
@@ -212,7 +201,7 @@ namespace ARMeilleure.Translation
// The only block without any predecessor should be the entry block.
// It always needs a context load as it is the first block to run.
- if (block == cfg.Entry || hasContextLoad)
+ if (block.Predecessors.Count == 0 || hasContextLoad)
{
long vecMask = globalInputs[block.Index].VecMask;
long intMask = globalInputs[block.Index].IntMask;
diff --git a/src/ARMeilleure/Translation/TranslatorQueue.cs b/src/ARMeilleure/Translation/TranslatorQueue.cs
index 831522bc1..cee2f9080 100644
--- a/src/ARMeilleure/Translation/TranslatorQueue.cs
+++ b/src/ARMeilleure/Translation/TranslatorQueue.cs
@@ -80,10 +80,7 @@ namespace ARMeilleure.Translation
return true;
}
- if (!_disposed)
- {
- Monitor.Wait(Sync);
- }
+ Monitor.Wait(Sync);
}
}
diff --git a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs
index 4eb75a578..62fe5025d 100644
--- a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs
+++ b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs
@@ -89,9 +89,9 @@ namespace Ryujinx.Audio.Backends.SDL2
return;
}
- using SpanOwner samplesOwner = SpanOwner.Rent(frameCount * _bytesPerFrame);
+ using IMemoryOwner samplesOwner = ByteMemoryPool.Rent(frameCount * _bytesPerFrame);
- Span samples = samplesOwner.Span;
+ Span samples = samplesOwner.Memory.Span;
_ringBuffer.Read(samples, 0, samples.Length);
diff --git a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs
index e9cc6a8e1..4011a1214 100644
--- a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs
+++ b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs
@@ -122,9 +122,9 @@ namespace Ryujinx.Audio.Backends.SoundIo
int channelCount = areas.Length;
- using SpanOwner samplesOwner = SpanOwner.Rent(frameCount * bytesPerFrame);
+ using IMemoryOwner samplesOwner = ByteMemoryPool.Rent(frameCount * bytesPerFrame);
- Span samples = samplesOwner.Span;
+ Span samples = samplesOwner.Memory.Span;
_ringBuffer.Read(samples, 0, samples.Length);
diff --git a/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs b/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
index 7aefe8865..b95e5bed1 100644
--- a/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
+++ b/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
@@ -14,7 +14,7 @@ namespace Ryujinx.Audio.Backends.Common
private readonly object _lock = new();
- private MemoryOwner _bufferOwner;
+ private IMemoryOwner _bufferOwner;
private Memory _buffer;
private int _size;
private int _headOffset;
@@ -24,7 +24,7 @@ namespace Ryujinx.Audio.Backends.Common
public DynamicRingBuffer(int initialCapacity = RingBufferAlignment)
{
- _bufferOwner = MemoryOwner.RentCleared(initialCapacity);
+ _bufferOwner = ByteMemoryPool.RentCleared(initialCapacity);
_buffer = _bufferOwner.Memory;
}
@@ -62,7 +62,7 @@ namespace Ryujinx.Audio.Backends.Common
private void SetCapacityLocked(int capacity)
{
- MemoryOwner newBufferOwner = MemoryOwner.RentCleared(capacity);
+ IMemoryOwner newBufferOwner = ByteMemoryPool.RentCleared(capacity);
Memory newBuffer = newBufferOwner.Memory;
if (_size > 0)
diff --git a/src/Ryujinx.Audio/Renderer/Common/VoiceUpdateState.cs b/src/Ryujinx.Audio/Renderer/Common/VoiceUpdateState.cs
index 7f881373f..608381af1 100644
--- a/src/Ryujinx.Audio/Renderer/Common/VoiceUpdateState.cs
+++ b/src/Ryujinx.Audio/Renderer/Common/VoiceUpdateState.cs
@@ -15,6 +15,7 @@ namespace Ryujinx.Audio.Renderer.Common
{
public const int Align = 0x10;
public const int BiquadStateOffset = 0x0;
+ public const int BiquadStateSize = 0x10;
///
/// The state of the biquad filters of this voice.
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/BiquadFilterHelper.cs b/src/Ryujinx.Audio/Renderer/Dsp/BiquadFilterHelper.cs
index 31f614d67..1a51a1fbd 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/BiquadFilterHelper.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/BiquadFilterHelper.cs
@@ -16,15 +16,10 @@ namespace Ryujinx.Audio.Renderer.Dsp
/// The biquad filter parameter
/// The biquad filter state
/// The output buffer to write the result
- /// The input buffer to read the samples from
+ /// The input buffer to write the result
/// The count of samples to process
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void ProcessBiquadFilter(
- ref BiquadFilterParameter parameter,
- ref BiquadFilterState state,
- Span outputBuffer,
- ReadOnlySpan inputBuffer,
- uint sampleCount)
+ public static void ProcessBiquadFilter(ref BiquadFilterParameter parameter, ref BiquadFilterState state, Span outputBuffer, ReadOnlySpan inputBuffer, uint sampleCount)
{
float a0 = FixedPointHelper.ToFloat(parameter.Numerator[0], FixedPointPrecisionForParameter);
float a1 = FixedPointHelper.ToFloat(parameter.Numerator[1], FixedPointPrecisionForParameter);
@@ -45,96 +40,6 @@ namespace Ryujinx.Audio.Renderer.Dsp
}
}
- ///
- /// Apply a single biquad filter and mix the result into the output buffer.
- ///
- /// This is implemented with a direct form 1.
- /// The biquad filter parameter
- /// The biquad filter state
- /// The output buffer to write the result
- /// The input buffer to read the samples from
- /// The count of samples to process
- /// Mix volume
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void ProcessBiquadFilterAndMix(
- ref BiquadFilterParameter parameter,
- ref BiquadFilterState state,
- Span outputBuffer,
- ReadOnlySpan inputBuffer,
- uint sampleCount,
- float volume)
- {
- float a0 = FixedPointHelper.ToFloat(parameter.Numerator[0], FixedPointPrecisionForParameter);
- float a1 = FixedPointHelper.ToFloat(parameter.Numerator[1], FixedPointPrecisionForParameter);
- float a2 = FixedPointHelper.ToFloat(parameter.Numerator[2], FixedPointPrecisionForParameter);
-
- float b1 = FixedPointHelper.ToFloat(parameter.Denominator[0], FixedPointPrecisionForParameter);
- float b2 = FixedPointHelper.ToFloat(parameter.Denominator[1], FixedPointPrecisionForParameter);
-
- for (int i = 0; i < sampleCount; i++)
- {
- float input = inputBuffer[i];
- float output = input * a0 + state.State0 * a1 + state.State1 * a2 + state.State2 * b1 + state.State3 * b2;
-
- state.State1 = state.State0;
- state.State0 = input;
- state.State3 = state.State2;
- state.State2 = output;
-
- outputBuffer[i] += FloatingPointHelper.MultiplyRoundUp(output, volume);
- }
- }
-
- ///
- /// Apply a single biquad filter and mix the result into the output buffer with volume ramp.
- ///
- /// This is implemented with a direct form 1.
- /// The biquad filter parameter
- /// The biquad filter state
- /// The output buffer to write the result
- /// The input buffer to read the samples from
- /// The count of samples to process
- /// Initial mix volume
- /// Volume increment step
- /// Last filtered sample value
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static float ProcessBiquadFilterAndMixRamp(
- ref BiquadFilterParameter parameter,
- ref BiquadFilterState state,
- Span outputBuffer,
- ReadOnlySpan inputBuffer,
- uint sampleCount,
- float volume,
- float ramp)
- {
- float a0 = FixedPointHelper.ToFloat(parameter.Numerator[0], FixedPointPrecisionForParameter);
- float a1 = FixedPointHelper.ToFloat(parameter.Numerator[1], FixedPointPrecisionForParameter);
- float a2 = FixedPointHelper.ToFloat(parameter.Numerator[2], FixedPointPrecisionForParameter);
-
- float b1 = FixedPointHelper.ToFloat(parameter.Denominator[0], FixedPointPrecisionForParameter);
- float b2 = FixedPointHelper.ToFloat(parameter.Denominator[1], FixedPointPrecisionForParameter);
-
- float mixState = 0f;
-
- for (int i = 0; i < sampleCount; i++)
- {
- float input = inputBuffer[i];
- float output = input * a0 + state.State0 * a1 + state.State1 * a2 + state.State2 * b1 + state.State3 * b2;
-
- state.State1 = state.State0;
- state.State0 = input;
- state.State3 = state.State2;
- state.State2 = output;
-
- mixState = FloatingPointHelper.MultiplyRoundUp(output, volume);
-
- outputBuffer[i] += mixState;
- volume += ramp;
- }
-
- return mixState;
- }
-
///
/// Apply multiple biquad filter.
///
@@ -142,15 +47,10 @@ namespace Ryujinx.Audio.Renderer.Dsp
/// The biquad filter parameter
/// The biquad filter state
/// The output buffer to write the result
- /// The input buffer to read the samples from
+ /// The input buffer to write the result
/// The count of samples to process
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void ProcessBiquadFilter(
- ReadOnlySpan parameters,
- Span states,
- Span outputBuffer,
- ReadOnlySpan inputBuffer,
- uint sampleCount)
+ public static void ProcessBiquadFilter(ReadOnlySpan parameters, Span states, Span outputBuffer, ReadOnlySpan inputBuffer, uint sampleCount)
{
for (int stageIndex = 0; stageIndex < parameters.Length; stageIndex++)
{
@@ -167,7 +67,7 @@ namespace Ryujinx.Audio.Renderer.Dsp
for (int i = 0; i < sampleCount; i++)
{
- float input = stageIndex != 0 ? outputBuffer[i] : inputBuffer[i];
+ float input = inputBuffer[i];
float output = input * a0 + state.State0 * a1 + state.State1 * a2 + state.State2 * b1 + state.State3 * b2;
state.State1 = state.State0;
@@ -179,129 +79,5 @@ namespace Ryujinx.Audio.Renderer.Dsp
}
}
}
-
- ///
- /// Apply double biquad filter and mix the result into the output buffer.
- ///
- /// This is implemented with a direct form 1.
- /// The biquad filter parameter
- /// The biquad filter state
- /// The output buffer to write the result
- /// The input buffer to read the samples from
- /// The count of samples to process
- /// Mix volume
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void ProcessDoubleBiquadFilterAndMix(
- ref BiquadFilterParameter parameter0,
- ref BiquadFilterParameter parameter1,
- ref BiquadFilterState state0,
- ref BiquadFilterState state1,
- Span outputBuffer,
- ReadOnlySpan inputBuffer,
- uint sampleCount,
- float volume)
- {
- float a00 = FixedPointHelper.ToFloat(parameter0.Numerator[0], FixedPointPrecisionForParameter);
- float a10 = FixedPointHelper.ToFloat(parameter0.Numerator[1], FixedPointPrecisionForParameter);
- float a20 = FixedPointHelper.ToFloat(parameter0.Numerator[2], FixedPointPrecisionForParameter);
-
- float b10 = FixedPointHelper.ToFloat(parameter0.Denominator[0], FixedPointPrecisionForParameter);
- float b20 = FixedPointHelper.ToFloat(parameter0.Denominator[1], FixedPointPrecisionForParameter);
-
- float a01 = FixedPointHelper.ToFloat(parameter1.Numerator[0], FixedPointPrecisionForParameter);
- float a11 = FixedPointHelper.ToFloat(parameter1.Numerator[1], FixedPointPrecisionForParameter);
- float a21 = FixedPointHelper.ToFloat(parameter1.Numerator[2], FixedPointPrecisionForParameter);
-
- float b11 = FixedPointHelper.ToFloat(parameter1.Denominator[0], FixedPointPrecisionForParameter);
- float b21 = FixedPointHelper.ToFloat(parameter1.Denominator[1], FixedPointPrecisionForParameter);
-
- for (int i = 0; i < sampleCount; i++)
- {
- float input = inputBuffer[i];
- float output = input * a00 + state0.State0 * a10 + state0.State1 * a20 + state0.State2 * b10 + state0.State3 * b20;
-
- state0.State1 = state0.State0;
- state0.State0 = input;
- state0.State3 = state0.State2;
- state0.State2 = output;
-
- input = output;
- output = input * a01 + state1.State0 * a11 + state1.State1 * a21 + state1.State2 * b11 + state1.State3 * b21;
-
- state1.State1 = state1.State0;
- state1.State0 = input;
- state1.State3 = state1.State2;
- state1.State2 = output;
-
- outputBuffer[i] += FloatingPointHelper.MultiplyRoundUp(output, volume);
- }
- }
-
- ///
- /// Apply double biquad filter and mix the result into the output buffer with volume ramp.
- ///
- /// This is implemented with a direct form 1.
- /// The biquad filter parameter
- /// The biquad filter state
- /// The output buffer to write the result
- /// The input buffer to read the samples from
- /// The count of samples to process
- /// Initial mix volume
- /// Volume increment step
- /// Last filtered sample value
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static float ProcessDoubleBiquadFilterAndMixRamp(
- ref BiquadFilterParameter parameter0,
- ref BiquadFilterParameter parameter1,
- ref BiquadFilterState state0,
- ref BiquadFilterState state1,
- Span outputBuffer,
- ReadOnlySpan inputBuffer,
- uint sampleCount,
- float volume,
- float ramp)
- {
- float a00 = FixedPointHelper.ToFloat(parameter0.Numerator[0], FixedPointPrecisionForParameter);
- float a10 = FixedPointHelper.ToFloat(parameter0.Numerator[1], FixedPointPrecisionForParameter);
- float a20 = FixedPointHelper.ToFloat(parameter0.Numerator[2], FixedPointPrecisionForParameter);
-
- float b10 = FixedPointHelper.ToFloat(parameter0.Denominator[0], FixedPointPrecisionForParameter);
- float b20 = FixedPointHelper.ToFloat(parameter0.Denominator[1], FixedPointPrecisionForParameter);
-
- float a01 = FixedPointHelper.ToFloat(parameter1.Numerator[0], FixedPointPrecisionForParameter);
- float a11 = FixedPointHelper.ToFloat(parameter1.Numerator[1], FixedPointPrecisionForParameter);
- float a21 = FixedPointHelper.ToFloat(parameter1.Numerator[2], FixedPointPrecisionForParameter);
-
- float b11 = FixedPointHelper.ToFloat(parameter1.Denominator[0], FixedPointPrecisionForParameter);
- float b21 = FixedPointHelper.ToFloat(parameter1.Denominator[1], FixedPointPrecisionForParameter);
-
- float mixState = 0f;
-
- for (int i = 0; i < sampleCount; i++)
- {
- float input = inputBuffer[i];
- float output = input * a00 + state0.State0 * a10 + state0.State1 * a20 + state0.State2 * b10 + state0.State3 * b20;
-
- state0.State1 = state0.State0;
- state0.State0 = input;
- state0.State3 = state0.State2;
- state0.State2 = output;
-
- input = output;
- output = input * a01 + state1.State0 * a11 + state1.State1 * a21 + state1.State2 * b11 + state1.State3 * b21;
-
- state1.State1 = state1.State0;
- state1.State0 = input;
- state1.State3 = state1.State2;
- state1.State2 = output;
-
- mixState = FloatingPointHelper.MultiplyRoundUp(output, volume);
-
- outputBuffer[i] += mixState;
- volume += ramp;
- }
-
- return mixState;
- }
}
}
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/BiquadFilterAndMixCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/BiquadFilterAndMixCommand.cs
deleted file mode 100644
index 106fc0357..000000000
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/BiquadFilterAndMixCommand.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using Ryujinx.Audio.Renderer.Common;
-using Ryujinx.Audio.Renderer.Dsp.State;
-using Ryujinx.Audio.Renderer.Parameter;
-using System;
-
-namespace Ryujinx.Audio.Renderer.Dsp.Command
-{
- public class BiquadFilterAndMixCommand : ICommand
- {
- public bool Enabled { get; set; }
-
- public int NodeId { get; }
-
- public CommandType CommandType => CommandType.BiquadFilterAndMix;
-
- public uint EstimatedProcessingTime { get; set; }
-
- public ushort InputBufferIndex { get; }
- public ushort OutputBufferIndex { get; }
-
- private BiquadFilterParameter _parameter;
-
- public Memory BiquadFilterState { get; }
- public Memory PreviousBiquadFilterState { get; }
-
- public Memory State { get; }
-
- public int LastSampleIndex { get; }
-
- public float Volume0 { get; }
- public float Volume1 { get; }
-
- public bool NeedInitialization { get; }
- public bool HasVolumeRamp { get; }
- public bool IsFirstMixBuffer { get; }
-
- public BiquadFilterAndMixCommand(
- float volume0,
- float volume1,
- uint inputBufferIndex,
- uint outputBufferIndex,
- int lastSampleIndex,
- Memory state,
- ref BiquadFilterParameter filter,
- Memory biquadFilterState,
- Memory previousBiquadFilterState,
- bool needInitialization,
- bool hasVolumeRamp,
- bool isFirstMixBuffer,
- int nodeId)
- {
- Enabled = true;
- NodeId = nodeId;
-
- InputBufferIndex = (ushort)inputBufferIndex;
- OutputBufferIndex = (ushort)outputBufferIndex;
-
- _parameter = filter;
- BiquadFilterState = biquadFilterState;
- PreviousBiquadFilterState = previousBiquadFilterState;
-
- State = state;
- LastSampleIndex = lastSampleIndex;
-
- Volume0 = volume0;
- Volume1 = volume1;
-
- NeedInitialization = needInitialization;
- HasVolumeRamp = hasVolumeRamp;
- IsFirstMixBuffer = isFirstMixBuffer;
- }
-
- public void Process(CommandList context)
- {
- ReadOnlySpan inputBuffer = context.GetBuffer(InputBufferIndex);
- Span outputBuffer = context.GetBuffer(OutputBufferIndex);
-
- if (NeedInitialization)
- {
- // If there is no previous state, initialize to zero.
-
- BiquadFilterState.Span[0] = new BiquadFilterState();
- }
- else if (IsFirstMixBuffer)
- {
- // This is the first buffer, set previous state to current state.
-
- PreviousBiquadFilterState.Span[0] = BiquadFilterState.Span[0];
- }
- else
- {
- // Rewind the current state by copying back the previous state.
-
- BiquadFilterState.Span[0] = PreviousBiquadFilterState.Span[0];
- }
-
- if (HasVolumeRamp)
- {
- float volume = Volume0;
- float ramp = (Volume1 - Volume0) / (int)context.SampleCount;
-
- State.Span[0].LastSamples[LastSampleIndex] = BiquadFilterHelper.ProcessBiquadFilterAndMixRamp(
- ref _parameter,
- ref BiquadFilterState.Span[0],
- outputBuffer,
- inputBuffer,
- context.SampleCount,
- volume,
- ramp);
- }
- else
- {
- BiquadFilterHelper.ProcessBiquadFilterAndMix(
- ref _parameter,
- ref BiquadFilterState.Span[0],
- outputBuffer,
- inputBuffer,
- context.SampleCount,
- Volume1);
- }
- }
- }
-}
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandType.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandType.cs
index de5c0ea2c..098a04a04 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandType.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandType.cs
@@ -30,10 +30,8 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
CopyMixBuffer,
LimiterVersion1,
LimiterVersion2,
- MultiTapBiquadFilter,
+ GroupedBiquadFilter,
CaptureBuffer,
Compressor,
- BiquadFilterAndMix,
- MultiTapBiquadFilterAndMix,
}
}
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/MultiTapBiquadFilterCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/GroupedBiquadFilterCommand.cs
similarity index 84%
rename from src/Ryujinx.Audio/Renderer/Dsp/Command/MultiTapBiquadFilterCommand.cs
rename to src/Ryujinx.Audio/Renderer/Dsp/Command/GroupedBiquadFilterCommand.cs
index e159f8ef7..7af851bdc 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/MultiTapBiquadFilterCommand.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/GroupedBiquadFilterCommand.cs
@@ -4,13 +4,13 @@ using System;
namespace Ryujinx.Audio.Renderer.Dsp.Command
{
- public class MultiTapBiquadFilterCommand : ICommand
+ public class GroupedBiquadFilterCommand : ICommand
{
public bool Enabled { get; set; }
public int NodeId { get; }
- public CommandType CommandType => CommandType.MultiTapBiquadFilter;
+ public CommandType CommandType => CommandType.GroupedBiquadFilter;
public uint EstimatedProcessingTime { get; set; }
@@ -20,7 +20,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
private readonly int _outputBufferIndex;
private readonly bool[] _isInitialized;
- public MultiTapBiquadFilterCommand(int baseIndex, ReadOnlySpan filters, Memory biquadFilterStateMemory, int inputBufferOffset, int outputBufferOffset, ReadOnlySpan isInitialized, int nodeId)
+ public GroupedBiquadFilterCommand(int baseIndex, ReadOnlySpan filters, Memory biquadFilterStateMemory, int inputBufferOffset, int outputBufferOffset, ReadOnlySpan isInitialized, int nodeId)
{
_parameters = filters.ToArray();
_biquadFilterStates = biquadFilterStateMemory;
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/MixRampGroupedCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/MixRampGroupedCommand.cs
index 41ac84c1a..3c7dd63b2 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/MixRampGroupedCommand.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/MixRampGroupedCommand.cs
@@ -24,14 +24,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
public Memory State { get; }
- public MixRampGroupedCommand(
- uint mixBufferCount,
- uint inputBufferIndex,
- uint outputBufferIndex,
- ReadOnlySpan volume0,
- ReadOnlySpan volume1,
- Memory state,
- int nodeId)
+ public MixRampGroupedCommand(uint mixBufferCount, uint inputBufferIndex, uint outputBufferIndex, Span volume0, Span volume1, Memory state, int nodeId)
{
Enabled = true;
MixBufferCount = mixBufferCount;
@@ -55,12 +48,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static float ProcessMixRampGrouped(
- Span outputBuffer,
- ReadOnlySpan inputBuffer,
- float volume0,
- float volume1,
- int sampleCount)
+ private static float ProcessMixRampGrouped(Span outputBuffer, ReadOnlySpan inputBuffer, float volume0, float volume1, int sampleCount)
{
float ramp = (volume1 - volume0) / sampleCount;
float volume = volume0;
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/MultiTapBiquadFilterAndMixCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/MultiTapBiquadFilterAndMixCommand.cs
deleted file mode 100644
index e359371b4..000000000
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/MultiTapBiquadFilterAndMixCommand.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using Ryujinx.Audio.Renderer.Common;
-using Ryujinx.Audio.Renderer.Dsp.State;
-using Ryujinx.Audio.Renderer.Parameter;
-using System;
-
-namespace Ryujinx.Audio.Renderer.Dsp.Command
-{
- public class MultiTapBiquadFilterAndMixCommand : ICommand
- {
- public bool Enabled { get; set; }
-
- public int NodeId { get; }
-
- public CommandType CommandType => CommandType.MultiTapBiquadFilterAndMix;
-
- public uint EstimatedProcessingTime { get; set; }
-
- public ushort InputBufferIndex { get; }
- public ushort OutputBufferIndex { get; }
-
- private BiquadFilterParameter _parameter0;
- private BiquadFilterParameter _parameter1;
-
- public Memory BiquadFilterState0 { get; }
- public Memory BiquadFilterState1 { get; }
- public Memory PreviousBiquadFilterState0 { get; }
- public Memory PreviousBiquadFilterState1 { get; }
-
- public Memory State { get; }
-
- public int LastSampleIndex { get; }
-
- public float Volume0 { get; }
- public float Volume1 { get; }
-
- public bool NeedInitialization0 { get; }
- public bool NeedInitialization1 { get; }
- public bool HasVolumeRamp { get; }
- public bool IsFirstMixBuffer { get; }
-
- public MultiTapBiquadFilterAndMixCommand(
- float volume0,
- float volume1,
- uint inputBufferIndex,
- uint outputBufferIndex,
- int lastSampleIndex,
- Memory state,
- ref BiquadFilterParameter filter0,
- ref BiquadFilterParameter filter1,
- Memory biquadFilterState0,
- Memory biquadFilterState1,
- Memory previousBiquadFilterState0,
- Memory previousBiquadFilterState1,
- bool needInitialization0,
- bool needInitialization1,
- bool hasVolumeRamp,
- bool isFirstMixBuffer,
- int nodeId)
- {
- Enabled = true;
- NodeId = nodeId;
-
- InputBufferIndex = (ushort)inputBufferIndex;
- OutputBufferIndex = (ushort)outputBufferIndex;
-
- _parameter0 = filter0;
- _parameter1 = filter1;
- BiquadFilterState0 = biquadFilterState0;
- BiquadFilterState1 = biquadFilterState1;
- PreviousBiquadFilterState0 = previousBiquadFilterState0;
- PreviousBiquadFilterState1 = previousBiquadFilterState1;
-
- State = state;
- LastSampleIndex = lastSampleIndex;
-
- Volume0 = volume0;
- Volume1 = volume1;
-
- NeedInitialization0 = needInitialization0;
- NeedInitialization1 = needInitialization1;
- HasVolumeRamp = hasVolumeRamp;
- IsFirstMixBuffer = isFirstMixBuffer;
- }
-
- private void UpdateState(Memory state, Memory previousState, bool needInitialization)
- {
- if (needInitialization)
- {
- // If there is no previous state, initialize to zero.
-
- state.Span[0] = new BiquadFilterState();
- }
- else if (IsFirstMixBuffer)
- {
- // This is the first buffer, set previous state to current state.
-
- previousState.Span[0] = state.Span[0];
- }
- else
- {
- // Rewind the current state by copying back the previous state.
-
- state.Span[0] = previousState.Span[0];
- }
- }
-
- public void Process(CommandList context)
- {
- ReadOnlySpan inputBuffer = context.GetBuffer(InputBufferIndex);
- Span