diff options
Diffstat (limited to 'Ryujinx.Audio/Renderer/Dsp/DataSourceHelper.cs')
-rw-r--r-- | Ryujinx.Audio/Renderer/Dsp/DataSourceHelper.cs | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/Ryujinx.Audio/Renderer/Dsp/DataSourceHelper.cs b/Ryujinx.Audio/Renderer/Dsp/DataSourceHelper.cs index c9514529..373776b7 100644 --- a/Ryujinx.Audio/Renderer/Dsp/DataSourceHelper.cs +++ b/Ryujinx.Audio/Renderer/Dsp/DataSourceHelper.cs @@ -26,6 +26,7 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; using System.Runtime.Intrinsics.X86; using static Ryujinx.Audio.Renderer.Parameter.VoiceInParameter; @@ -320,6 +321,24 @@ namespace Ryujinx.Audio.Renderer.Dsp } } + private static void ToFloatAdvSimd(Span<float> output, ReadOnlySpan<int> input, int sampleCount) + { + ReadOnlySpan<Vector128<int>> inputVec = MemoryMarshal.Cast<int, Vector128<int>>(input); + Span<Vector128<float>> outputVec = MemoryMarshal.Cast<float, Vector128<float>>(output); + + int sisdStart = inputVec.Length * 4; + + for (int i = 0; i < inputVec.Length; i++) + { + outputVec[i] = AdvSimd.ConvertToSingle(inputVec[i]); + } + + for (int i = sisdStart; i < sampleCount; i++) + { + output[i] = input[i]; + } + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void ToFloatSlow(Span<float> output, ReadOnlySpan<int> input, int sampleCount) { @@ -339,6 +358,10 @@ namespace Ryujinx.Audio.Renderer.Dsp { ToFloatSse2(output, input, sampleCount); } + else if (AdvSimd.IsSupported) + { + ToFloatAdvSimd(output, input, sampleCount); + } else { ToFloatSlow(output, input, sampleCount); @@ -372,7 +395,25 @@ namespace Ryujinx.Audio.Renderer.Dsp for (int i = 0; i < inputVec.Length; i++) { - outputVec[i] = Avx.ConvertToVector128Int32(inputVec[i]); + outputVec[i] = Sse2.ConvertToVector128Int32(inputVec[i]); + } + + for (int i = sisdStart; i < sampleCount; i++) + { + output[i] = (int)input[i]; + } + } + + public static void ToIntAdvSimd(Span<int> output, ReadOnlySpan<float> input, int sampleCount) + { + ReadOnlySpan<Vector128<float>> inputVec = MemoryMarshal.Cast<float, Vector128<float>>(input); + Span<Vector128<int>> outputVec = MemoryMarshal.Cast<int, Vector128<int>>(output); + + int sisdStart = inputVec.Length * 4; + + for (int i = 0; i < inputVec.Length; i++) + { + outputVec[i] = AdvSimd.ConvertToInt32RoundToZero(inputVec[i]); } for (int i = sisdStart; i < sampleCount; i++) @@ -400,6 +441,10 @@ namespace Ryujinx.Audio.Renderer.Dsp { ToIntSse2(output, input, sampleCount); } + else if (AdvSimd.IsSupported) + { + ToIntAdvSimd(output, input, sampleCount); + } else { ToIntSlow(output, input, sampleCount); |