Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ IndexOfAny() [4/6]

static int System.SpanHelpers.IndexOfAny ( ref char searchStart,
char value0,
char value1,
char value2,
char value3,
int length )
inlinestatic

Definition at line 2244 of file SpanHelpers.cs.

2245 {
2246 nuint num = 0u;
2247 nuint num2 = (uint)length;
2248 int num4;
2249 if (Sse2.IsSupported)
2250 {
2251 nint num3 = (nint)length - (nint)Vector128<ushort>.Count;
2252 if (num3 >= 0)
2253 {
2254 num2 = (nuint)num3;
2255 if (Sse2.IsSupported)
2256 {
2257 if (Avx2.IsSupported && num2 >= (nuint)Vector128<ushort>.Count)
2258 {
2263 num2 -= (nuint)Vector128<ushort>.Count;
2264 Vector256<ushort> right;
2265 while (num2 > num)
2266 {
2267 right = LoadVector256(ref searchStart, num);
2268 num4 = Avx2.MoveMask(Avx2.CompareEqual(left, right).AsByte());
2269 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left2, right).AsByte());
2270 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left3, right).AsByte());
2271 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left4, right).AsByte());
2272 if (num4 == 0)
2273 {
2274 num += (nuint)Vector256<ushort>.Count;
2275 continue;
2276 }
2277 goto IL_036f;
2278 }
2280 num = num2;
2281 num4 = Avx2.MoveMask(Avx2.CompareEqual(left, right).AsByte());
2282 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left2, right).AsByte());
2283 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left3, right).AsByte());
2284 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left4, right).AsByte());
2285 if (num4 == 0)
2286 {
2287 goto IL_0115;
2288 }
2289 }
2290 else
2291 {
2297 while (num2 > num)
2298 {
2304 if (num4 == 0)
2305 {
2306 num += (nuint)Vector128<ushort>.Count;
2307 continue;
2308 }
2309 goto IL_036f;
2310 }
2312 num = num2;
2317 if (num4 == 0)
2318 {
2319 goto IL_0115;
2320 }
2321 }
2322 goto IL_036f;
2323 }
2324 goto IL_0381;
2325 }
2326 }
2328 {
2329 nint num5 = (nint)length - (nint)Vector<ushort>.Count;
2330 if (num5 >= 0)
2331 {
2332 num2 = (nuint)num5;
2333 goto IL_0381;
2334 }
2335 }
2336 while (num2 >= 4)
2337 {
2338 ref char reference = ref Add(ref searchStart, num);
2339 int num6 = reference;
2340 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6)
2341 {
2342 num6 = Unsafe.Add(ref reference, 1);
2343 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6)
2344 {
2345 num6 = Unsafe.Add(ref reference, 2);
2346 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6)
2347 {
2348 num6 = Unsafe.Add(ref reference, 3);
2349 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6)
2350 {
2351 num += 4;
2352 num2 -= 4;
2353 continue;
2354 }
2355 return (int)(num + 3);
2356 }
2357 return (int)(num + 2);
2358 }
2359 return (int)(num + 1);
2360 }
2361 goto IL_0129;
2362 }
2363 while (num2 != 0)
2364 {
2365 int num6 = Add(ref searchStart, num);
2366 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6)
2367 {
2368 num++;
2369 num2--;
2370 continue;
2371 }
2372 goto IL_0129;
2373 }
2374 goto IL_0115;
2375 IL_0129:
2376 return (int)num;
2377 IL_0115:
2378 return -1;
2379 IL_046a:
2381 num += (uint)LocateFirstFoundChar(vector);
2382 goto IL_0129;
2383 IL_036f:
2384 num += (nuint)(uint)BitOperations.TrailingZeroCount(num4) >> 1;
2385 goto IL_0129;
2386 IL_0381:
2388 {
2393 while (num2 > num)
2394 {
2397 if (Vector<ushort>.Zero.Equals(vector))
2398 {
2399 num += (nuint)Vector<ushort>.Count;
2400 continue;
2401 }
2402 goto IL_046a;
2403 }
2405 num = num2;
2407 if (!Vector<ushort>.Zero.Equals(vector))
2408 {
2409 goto IL_046a;
2410 }
2411 }
2412 goto IL_0115;
2413 }
static int TrailingZeroCount(int value)
static bool IsHardwareAccelerated
Definition Vector.cs:14
static Vector< int > Equals(Vector< float > left, Vector< float > right)
Definition Vector.cs:52
static Vector128< byte > Create(byte value)
Definition Vector128.cs:138
static Vector256< byte > Create(byte value)
Definition Vector256.cs:105
static int MoveMask(Vector256< sbyte > value)
Definition Avx2.cs:1578
static Vector256< sbyte > CompareEqual(Vector256< sbyte > left, Vector256< sbyte > right)
Definition Avx2.cs:512
static new bool IsSupported
Definition Avx2.cs:15
static int MoveMask(Vector128< sbyte > value)
Definition Sse2.cs:772
static Vector128< sbyte > CompareEqual(Vector128< sbyte > left, Vector128< sbyte > right)
Definition Sse2.cs:232
static new bool IsSupported
Definition Sse2.cs:60
static Vector< byte > LoadVector(ref byte start, nuint offset)
static Vector128< byte > LoadVector128(ref byte start, nuint offset)
static int LocateFirstFoundChar(Vector< ushort > match)
static Vector256< byte > LoadVector256(ref byte start, nuint offset)

References System.Add, System.Runtime.Intrinsics.X86.Sse2.CompareEqual(), System.Runtime.Intrinsics.X86.Avx2.CompareEqual(), System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.Runtime.Intrinsics.Vector128< T >.Create(), System.Runtime.Intrinsics.Vector256< T >.Create(), System.Numerics.Vector< T >.Equals(), System.Numerics.Vector< T >.IsHardwareAccelerated, System.Runtime.Intrinsics.X86.Avx2.IsSupported, System.Runtime.Intrinsics.X86.Sse2.IsSupported, System.length, System.SpanHelpers.LoadVector(), System.SpanHelpers.LoadVector128(), System.SpanHelpers.LoadVector256(), System.SpanHelpers.LocateFirstFoundChar(), System.Runtime.Intrinsics.X86.Sse2.MoveMask(), System.Runtime.Intrinsics.X86.Avx2.MoveMask(), and System.Numerics.BitOperations.TrailingZeroCount().