diff --git a/src/Shared/QueryStringEnumerable.cs b/src/Shared/QueryStringEnumerable.cs index 4ce4a3339247..5251e414117d 100644 --- a/src/Shared/QueryStringEnumerable.cs +++ b/src/Shared/QueryStringEnumerable.cs @@ -184,17 +184,32 @@ private static unsafe void ReplacePlusWithSpaceCore(Span buffer, IntPtr st var i = (nint)0; var n = (nint)(uint)buffer.Length; - if (Sse41.IsSupported && n >= Vector128.Count) + if (Vector256.IsHardwareAccelerated && n >= Vector256.Count) + { + var vecPlus = Vector256.Create((ushort)'+'); + var vecSpace = Vector256.Create((ushort)' '); + + do + { + var vec = Vector256.Load(input + i); + var mask = Vector256.Equals(vec, vecPlus); + var res = Vector256.ConditionalSelect(mask, vecSpace, vec); + res.Store(output + i); + i += Vector256.Count; + } while (i <= n - Vector256.Count); + } + + if (Vector128.IsHardwareAccelerated && n - i >= Vector128.Count) { var vecPlus = Vector128.Create((ushort)'+'); var vecSpace = Vector128.Create((ushort)' '); do { - var vec = Sse2.LoadVector128(input + i); - var mask = Sse2.CompareEqual(vec, vecPlus); - var res = Sse41.BlendVariable(vec, vecSpace, mask); - Sse2.Store(output + i, res); + var vec = Vector128.Load(input + i); + var mask = Vector128.Equals(vec, vecPlus); + var res = Vector128.ConditionalSelect(mask, vecSpace, vec); + res.Store(output + i); i += Vector128.Count; } while (i <= n - Vector128.Count); }