diff options
| author | Mary <me@thog.eu> | 2021-03-02 23:50:46 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-02 23:50:46 +0100 |
| commit | 31fca432a7274907c46f6ec254d54e96cb6446c6 (patch) | |
| tree | 7008b6c1e161ce36dcd13ba3eef1990b42ca8f8e /Ryujinx.Audio/Renderer/Dsp/DataSourceHelper.cs | |
| parent | 3d04d7ef0870fe74c529dd6c35e1c02d869bd3c0 (diff) | |
Amadeus: Add ARM SIMD fast path (#2069)
Add fast paths in the audio renderer for AArch64 in all current fast paths.
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); |
