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

◆ IndexOfAny() [3/6]

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

Definition at line 2416 of file SpanHelpers.cs.

2417 {
2418 nuint num = 0u;
2419 nuint num2 = (uint)length;
2420 int num4;
2421 if (Sse2.IsSupported)
2422 {
2423 nint num3 = (nint)length - (nint)Vector128<ushort>.Count;
2424 if (num3 >= 0)
2425 {
2426 num2 = (nuint)num3;
2427 if (Sse2.IsSupported)
2428 {
2429 if (Avx2.IsSupported && num2 >= (nuint)Vector128<ushort>.Count)
2430 {
2436 num2 -= (nuint)Vector128<ushort>.Count;
2437 Vector256<ushort> right;
2438 while (num2 > num)
2439 {
2440 right = LoadVector256(ref searchStart, num);
2441 num4 = Avx2.MoveMask(Avx2.CompareEqual(left, right).AsByte());
2442 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left2, right).AsByte());
2443 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left3, right).AsByte());
2444 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left4, right).AsByte());
2445 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left5, right).AsByte());
2446 if (num4 == 0)
2447 {
2448 num += (nuint)Vector256<ushort>.Count;
2449 continue;
2450 }
2451 goto IL_040f;
2452 }
2454 num = num2;
2455 num4 = Avx2.MoveMask(Avx2.CompareEqual(left, right).AsByte());
2456 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left2, right).AsByte());
2457 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left3, right).AsByte());
2458 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left4, right).AsByte());
2459 num4 |= Avx2.MoveMask(Avx2.CompareEqual(left5, right).AsByte());
2460 if (num4 == 0)
2461 {
2462 goto IL_0134;
2463 }
2464 }
2465 else
2466 {
2473 while (num2 > num)
2474 {
2481 if (num4 == 0)
2482 {
2483 num += (nuint)Vector128<ushort>.Count;
2484 continue;
2485 }
2486 goto IL_040f;
2487 }
2489 num = num2;
2495 if (num4 == 0)
2496 {
2497 goto IL_0134;
2498 }
2499 }
2500 goto IL_040f;
2501 }
2502 goto IL_0421;
2503 }
2504 }
2506 {
2507 nint num5 = (nint)length - (nint)Vector<ushort>.Count;
2508 if (num5 >= 0)
2509 {
2510 num2 = (nuint)num5;
2511 goto IL_0421;
2512 }
2513 }
2514 while (num2 >= 4)
2515 {
2516 ref char reference = ref Add(ref searchStart, num);
2517 int num6 = reference;
2518 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6 && value4 != num6)
2519 {
2520 num6 = Unsafe.Add(ref reference, 1);
2521 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6 && value4 != num6)
2522 {
2523 num6 = Unsafe.Add(ref reference, 2);
2524 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6 && value4 != num6)
2525 {
2526 num6 = Unsafe.Add(ref reference, 3);
2527 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6 && value4 != num6)
2528 {
2529 num += 4;
2530 num2 -= 4;
2531 continue;
2532 }
2533 return (int)(num + 3);
2534 }
2535 return (int)(num + 2);
2536 }
2537 return (int)(num + 1);
2538 }
2539 goto IL_0148;
2540 }
2541 while (num2 != 0)
2542 {
2543 int num6 = Add(ref searchStart, num);
2544 if (value0 != num6 && value1 != num6 && value2 != num6 && value3 != num6 && value4 != num6)
2545 {
2546 num++;
2547 num2--;
2548 continue;
2549 }
2550 goto IL_0148;
2551 }
2552 goto IL_0134;
2553 IL_0148:
2554 return (int)num;
2555 IL_052f:
2557 num += (uint)LocateFirstFoundChar(vector);
2558 goto IL_0148;
2559 IL_0421:
2561 {
2567 while (num2 > num)
2568 {
2571 if (Vector<ushort>.Zero.Equals(vector))
2572 {
2573 num += (nuint)Vector<ushort>.Count;
2574 continue;
2575 }
2576 goto IL_052f;
2577 }
2579 num = num2;
2581 if (!Vector<ushort>.Zero.Equals(vector))
2582 {
2583 goto IL_052f;
2584 }
2585 }
2586 goto IL_0134;
2587 IL_0134:
2588 return -1;
2589 IL_040f:
2590 num += (nuint)(uint)BitOperations.TrailingZeroCount(num4) >> 1;
2591 goto IL_0148;
2592 }
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().