Skip to content

Commit e00b58e

Browse files
authored
Use Vector instead of direct intrinsics (#41790)
1 parent 7e20302 commit e00b58e

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

src/Shared/QueryStringEnumerable.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,17 +184,32 @@ private static unsafe void ReplacePlusWithSpaceCore(Span<char> buffer, IntPtr st
184184
var i = (nint)0;
185185
var n = (nint)(uint)buffer.Length;
186186

187-
if (Sse41.IsSupported && n >= Vector128<ushort>.Count)
187+
if (Vector256.IsHardwareAccelerated && n >= Vector256<ushort>.Count)
188+
{
189+
var vecPlus = Vector256.Create((ushort)'+');
190+
var vecSpace = Vector256.Create((ushort)' ');
191+
192+
do
193+
{
194+
var vec = Vector256.Load(input + i);
195+
var mask = Vector256.Equals(vec, vecPlus);
196+
var res = Vector256.ConditionalSelect(mask, vecSpace, vec);
197+
res.Store(output + i);
198+
i += Vector256<ushort>.Count;
199+
} while (i <= n - Vector256<ushort>.Count);
200+
}
201+
202+
if (Vector128.IsHardwareAccelerated && n - i >= Vector128<ushort>.Count)
188203
{
189204
var vecPlus = Vector128.Create((ushort)'+');
190205
var vecSpace = Vector128.Create((ushort)' ');
191206

192207
do
193208
{
194-
var vec = Sse2.LoadVector128(input + i);
195-
var mask = Sse2.CompareEqual(vec, vecPlus);
196-
var res = Sse41.BlendVariable(vec, vecSpace, mask);
197-
Sse2.Store(output + i, res);
209+
var vec = Vector128.Load(input + i);
210+
var mask = Vector128.Equals(vec, vecPlus);
211+
var res = Vector128.ConditionalSelect(mask, vecSpace, vec);
212+
res.Store(output + i);
198213
i += Vector128<ushort>.Count;
199214
} while (i <= n - Vector128<ushort>.Count);
200215
}

0 commit comments

Comments
 (0)