using System.Diagnostics;
using System.Runtime.CompilerServices; // Do not remove. This is necessary for netstandard, since this file is mirrored into corefx
-using System.Numerics;
#if !netstandard
using Internal.Runtime.CompilerServices;
}
// Adapted from IndexOf(...)
- public static bool Contains<T>(ref T searchSpace, T value, int length)
+ public unsafe static bool Contains<T>(ref T searchSpace, T value, int length)
where T : IEquatable<T>
{
Debug.Assert(length >= 0);
IntPtr index = (IntPtr)0; // Use IntPtr for arithmetic to avoid unnecessary 64->32->64 truncations
- while (length >= 8)
- {
- length -= 8;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 0)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 1)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 2)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 3)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 4)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 5)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 6)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 7)))
+ if (default(T) != null || (object)value != null)
+ {
+ while (length >= 8)
{
- goto Found;
+ length -= 8;
+
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 0)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 1)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 2)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 3)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 4)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 5)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 6)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 7)))
+ {
+ goto Found;
+ }
+
+ index += 8;
}
- index += 8;
- }
+ if (length >= 4)
+ {
+ length -= 4;
- if (length >= 4)
- {
- length -= 4;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 0)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 1)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 2)) ||
+ value.Equals(Unsafe.Add(ref searchSpace, index + 3)))
+ {
+ goto Found;
+ }
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 0)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 1)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 2)) ||
- value.Equals(Unsafe.Add(ref searchSpace, index + 3)))
- {
- goto Found;
+ index += 4;
}
- index += 4;
- }
-
- while (length > 0)
- {
- length -= 1;
+ while (length > 0)
+ {
+ length -= 1;
- if (value.Equals(Unsafe.Add(ref searchSpace, index)))
- goto Found;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index)))
+ goto Found;
- index += 1;
+ index += 1;
+ }
+ }
+ else
+ {
+ byte* len = (byte*)length;
+ for (index = (IntPtr)0; index.ToPointer() < len; index += 1)
+ {
+ if ((object)Unsafe.Add(ref searchSpace, index) is null)
+ {
+ goto Found;
+ }
+ }
}
return false;
Debug.Assert(length >= 0);
IntPtr index = (IntPtr)0; // Use IntPtr for arithmetic to avoid unnecessary 64->32->64 truncations
- while (length >= 8)
+ if (default(T) != null || (object)value != null)
{
- length -= 8;
-
- if (value.Equals(Unsafe.Add(ref searchSpace, index)))
- goto Found;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 1)))
- goto Found1;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 2)))
- goto Found2;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 3)))
- goto Found3;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 4)))
- goto Found4;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 5)))
- goto Found5;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 6)))
- goto Found6;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 7)))
- goto Found7;
-
- index += 8;
- }
+ while (length >= 8)
+ {
+ length -= 8;
+
+ if (value.Equals(Unsafe.Add(ref searchSpace, index)))
+ goto Found;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 1)))
+ goto Found1;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 2)))
+ goto Found2;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 3)))
+ goto Found3;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 4)))
+ goto Found4;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 5)))
+ goto Found5;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 6)))
+ goto Found6;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 7)))
+ goto Found7;
+
+ index += 8;
+ }
- if (length >= 4)
- {
- length -= 4;
+ if (length >= 4)
+ {
+ length -= 4;
+
+ if (value.Equals(Unsafe.Add(ref searchSpace, index)))
+ goto Found;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 1)))
+ goto Found1;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 2)))
+ goto Found2;
+ if (value.Equals(Unsafe.Add(ref searchSpace, index + 3)))
+ goto Found3;
+
+ index += 4;
+ }
- if (value.Equals(Unsafe.Add(ref searchSpace, index)))
- goto Found;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 1)))
- goto Found1;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 2)))
- goto Found2;
- if (value.Equals(Unsafe.Add(ref searchSpace, index + 3)))
- goto Found3;
+ while (length > 0)
+ {
+ if (value.Equals(Unsafe.Add(ref searchSpace, index)))
+ goto Found;
- index += 4;
+ index += 1;
+ length--;
+ }
}
-
- while (length > 0)
+ else
{
- if (value.Equals(Unsafe.Add(ref searchSpace, index)))
- goto Found;
-
- index += 1;
- length--;
+ byte* len = (byte*)length;
+ for (index = (IntPtr)0; index.ToPointer() < len; index += 1)
+ {
+ if ((object)Unsafe.Add(ref searchSpace, index) is null)
+ {
+ goto Found;
+ }
+ }
}
return -1;
T lookUp;
int index = 0;
- while ((length - index) >= 8)
+ if (default(T) != null || ((object)value0 != null && (object)value1 != null))
{
- lookUp = Unsafe.Add(ref searchSpace, index);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found;
- lookUp = Unsafe.Add(ref searchSpace, index + 1);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found1;
- lookUp = Unsafe.Add(ref searchSpace, index + 2);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found2;
- lookUp = Unsafe.Add(ref searchSpace, index + 3);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found3;
- lookUp = Unsafe.Add(ref searchSpace, index + 4);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found4;
- lookUp = Unsafe.Add(ref searchSpace, index + 5);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found5;
- lookUp = Unsafe.Add(ref searchSpace, index + 6);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found6;
- lookUp = Unsafe.Add(ref searchSpace, index + 7);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found7;
+ while ((length - index) >= 8)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, index);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found;
+ lookUp = Unsafe.Add(ref searchSpace, index + 1);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found1;
+ lookUp = Unsafe.Add(ref searchSpace, index + 2);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found2;
+ lookUp = Unsafe.Add(ref searchSpace, index + 3);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found3;
+ lookUp = Unsafe.Add(ref searchSpace, index + 4);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found4;
+ lookUp = Unsafe.Add(ref searchSpace, index + 5);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found5;
+ lookUp = Unsafe.Add(ref searchSpace, index + 6);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found6;
+ lookUp = Unsafe.Add(ref searchSpace, index + 7);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found7;
+
+ index += 8;
+ }
- index += 8;
- }
+ if ((length - index) >= 4)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, index);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found;
+ lookUp = Unsafe.Add(ref searchSpace, index + 1);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found1;
+ lookUp = Unsafe.Add(ref searchSpace, index + 2);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found2;
+ lookUp = Unsafe.Add(ref searchSpace, index + 3);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found3;
+
+ index += 4;
+ }
- if ((length - index) >= 4)
- {
- lookUp = Unsafe.Add(ref searchSpace, index);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found;
- lookUp = Unsafe.Add(ref searchSpace, index + 1);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found1;
- lookUp = Unsafe.Add(ref searchSpace, index + 2);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found2;
- lookUp = Unsafe.Add(ref searchSpace, index + 3);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found3;
+ while (index < length)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, index);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found;
- index += 4;
+ index++;
+ }
}
-
- while (index < length)
+ else
{
- lookUp = Unsafe.Add(ref searchSpace, index);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found;
-
- index++;
+ for (index = 0; index < length; index++)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, index);
+ if ((object)lookUp is null)
+ {
+ if ((object)value0 is null || (object)value1 is null)
+ {
+ goto Found;
+ }
+ }
+ else if (lookUp.Equals(value0) || lookUp.Equals(value1))
+ {
+ goto Found;
+ }
+ }
}
+
return -1;
Found: // Workaround for https://github.com/dotnet/coreclr/issues/13549
T lookUp;
int index = 0;
- while ((length - index) >= 8)
+ if (default(T) != null || ((object)value0 != null && (object)value1 != null && (object)value2 != null))
{
- lookUp = Unsafe.Add(ref searchSpace, index);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found;
- lookUp = Unsafe.Add(ref searchSpace, index + 1);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found1;
- lookUp = Unsafe.Add(ref searchSpace, index + 2);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found2;
- lookUp = Unsafe.Add(ref searchSpace, index + 3);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found3;
- lookUp = Unsafe.Add(ref searchSpace, index + 4);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found4;
- lookUp = Unsafe.Add(ref searchSpace, index + 5);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found5;
- lookUp = Unsafe.Add(ref searchSpace, index + 6);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found6;
- lookUp = Unsafe.Add(ref searchSpace, index + 7);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found7;
+ while ((length - index) >= 8)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, index);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found;
+ lookUp = Unsafe.Add(ref searchSpace, index + 1);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found1;
+ lookUp = Unsafe.Add(ref searchSpace, index + 2);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found2;
+ lookUp = Unsafe.Add(ref searchSpace, index + 3);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found3;
+ lookUp = Unsafe.Add(ref searchSpace, index + 4);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found4;
+ lookUp = Unsafe.Add(ref searchSpace, index + 5);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found5;
+ lookUp = Unsafe.Add(ref searchSpace, index + 6);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found6;
+ lookUp = Unsafe.Add(ref searchSpace, index + 7);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found7;
+
+ index += 8;
+ }
- index += 8;
- }
+ if ((length - index) >= 4)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, index);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found;
+ lookUp = Unsafe.Add(ref searchSpace, index + 1);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found1;
+ lookUp = Unsafe.Add(ref searchSpace, index + 2);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found2;
+ lookUp = Unsafe.Add(ref searchSpace, index + 3);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found3;
+
+ index += 4;
+ }
- if ((length - index) >= 4)
- {
- lookUp = Unsafe.Add(ref searchSpace, index);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found;
- lookUp = Unsafe.Add(ref searchSpace, index + 1);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found1;
- lookUp = Unsafe.Add(ref searchSpace, index + 2);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found2;
- lookUp = Unsafe.Add(ref searchSpace, index + 3);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found3;
+ while (index < length)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, index);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found;
- index += 4;
+ index++;
+ }
}
-
- while (index < length)
+ else
{
- lookUp = Unsafe.Add(ref searchSpace, index);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found;
-
- index++;
+ for (index = 0; index < length; index++)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, index);
+ if ((object)lookUp is null)
+ {
+ if ((object)value0 is null || (object)value1 is null || (object)value2 is null)
+ {
+ goto Found;
+ }
+ }
+ else if (lookUp.Equals(value0) || lookUp.Equals(value1) || lookUp.Equals(value2))
+ {
+ goto Found;
+ }
+ }
}
return -1;
{
Debug.Assert(length >= 0);
- while (length >= 8)
+ if (default(T) != null || (object)value != null)
{
- length -= 8;
+ while (length >= 8)
+ {
+ length -= 8;
+
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 7)))
+ goto Found7;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 6)))
+ goto Found6;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 5)))
+ goto Found5;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 4)))
+ goto Found4;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 3)))
+ goto Found3;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 2)))
+ goto Found2;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 1)))
+ goto Found1;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length)))
+ goto Found;
+ }
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 7)))
- goto Found7;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 6)))
- goto Found6;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 5)))
- goto Found5;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 4)))
- goto Found4;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 3)))
- goto Found3;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 2)))
- goto Found2;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 1)))
- goto Found1;
- if (value.Equals(Unsafe.Add(ref searchSpace, length)))
- goto Found;
- }
+ if (length >= 4)
+ {
+ length -= 4;
+
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 3)))
+ goto Found3;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 2)))
+ goto Found2;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length + 1)))
+ goto Found1;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length)))
+ goto Found;
+ }
- if (length >= 4)
- {
- length -= 4;
+ while (length > 0)
+ {
+ length--;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 3)))
- goto Found3;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 2)))
- goto Found2;
- if (value.Equals(Unsafe.Add(ref searchSpace, length + 1)))
- goto Found1;
- if (value.Equals(Unsafe.Add(ref searchSpace, length)))
- goto Found;
+ if (value.Equals(Unsafe.Add(ref searchSpace, length)))
+ goto Found;
+ }
}
-
- while (length > 0)
+ else
{
- length--;
-
- if (value.Equals(Unsafe.Add(ref searchSpace, length)))
- goto Found;
+ for (length--; length >= 0; length--)
+ {
+ if ((object)Unsafe.Add(ref searchSpace, length) is null)
+ {
+ goto Found;
+ }
+ }
}
+
return -1;
Found: // Workaround for https://github.com/dotnet/coreclr/issues/13549
Debug.Assert(length >= 0);
T lookUp;
- while (length >= 8)
+ if (default(T) != null || ((object)value0 != null && (object)value1 != null))
{
- length -= 8;
+ while (length >= 8)
+ {
+ length -= 8;
+
+ lookUp = Unsafe.Add(ref searchSpace, length + 7);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found7;
+ lookUp = Unsafe.Add(ref searchSpace, length + 6);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found6;
+ lookUp = Unsafe.Add(ref searchSpace, length + 5);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found5;
+ lookUp = Unsafe.Add(ref searchSpace, length + 4);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found4;
+ lookUp = Unsafe.Add(ref searchSpace, length + 3);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found3;
+ lookUp = Unsafe.Add(ref searchSpace, length + 2);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found2;
+ lookUp = Unsafe.Add(ref searchSpace, length + 1);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found1;
+ lookUp = Unsafe.Add(ref searchSpace, length);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found;
+ }
- lookUp = Unsafe.Add(ref searchSpace, length + 7);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found7;
- lookUp = Unsafe.Add(ref searchSpace, length + 6);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found6;
- lookUp = Unsafe.Add(ref searchSpace, length + 5);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found5;
- lookUp = Unsafe.Add(ref searchSpace, length + 4);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found4;
- lookUp = Unsafe.Add(ref searchSpace, length + 3);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found3;
- lookUp = Unsafe.Add(ref searchSpace, length + 2);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found2;
- lookUp = Unsafe.Add(ref searchSpace, length + 1);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found1;
- lookUp = Unsafe.Add(ref searchSpace, length);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found;
- }
+ if (length >= 4)
+ {
+ length -= 4;
+
+ lookUp = Unsafe.Add(ref searchSpace, length + 3);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found3;
+ lookUp = Unsafe.Add(ref searchSpace, length + 2);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found2;
+ lookUp = Unsafe.Add(ref searchSpace, length + 1);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found1;
+ lookUp = Unsafe.Add(ref searchSpace, length);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found;
+ }
- if (length >= 4)
- {
- length -= 4;
+ while (length > 0)
+ {
+ length--;
- lookUp = Unsafe.Add(ref searchSpace, length + 3);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found3;
- lookUp = Unsafe.Add(ref searchSpace, length + 2);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found2;
- lookUp = Unsafe.Add(ref searchSpace, length + 1);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found1;
- lookUp = Unsafe.Add(ref searchSpace, length);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found;
+ lookUp = Unsafe.Add(ref searchSpace, length);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp))
+ goto Found;
+ }
}
-
- while (length > 0)
+ else
{
- length--;
-
- lookUp = Unsafe.Add(ref searchSpace, length);
- if (value0.Equals(lookUp) || value1.Equals(lookUp))
- goto Found;
+ for (length--; length >= 0; length--)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, length);
+ if ((object)lookUp is null)
+ {
+ if ((object)value0 is null || (object)value1 is null)
+ {
+ goto Found;
+ }
+ }
+ else if (lookUp.Equals(value0) || lookUp.Equals(value1))
+ {
+ goto Found;
+ }
+ }
}
+
return -1;
Found: // Workaround for https://github.com/dotnet/coreclr/issues/13549
Debug.Assert(length >= 0);
T lookUp;
- while (length >= 8)
+ if (default(T) != null || ((object)value0 != null && (object)value1 != null))
{
- length -= 8;
+ while (length >= 8)
+ {
+ length -= 8;
+
+ lookUp = Unsafe.Add(ref searchSpace, length + 7);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found7;
+ lookUp = Unsafe.Add(ref searchSpace, length + 6);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found6;
+ lookUp = Unsafe.Add(ref searchSpace, length + 5);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found5;
+ lookUp = Unsafe.Add(ref searchSpace, length + 4);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found4;
+ lookUp = Unsafe.Add(ref searchSpace, length + 3);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found3;
+ lookUp = Unsafe.Add(ref searchSpace, length + 2);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found2;
+ lookUp = Unsafe.Add(ref searchSpace, length + 1);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found1;
+ lookUp = Unsafe.Add(ref searchSpace, length);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found;
+ }
- lookUp = Unsafe.Add(ref searchSpace, length + 7);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found7;
- lookUp = Unsafe.Add(ref searchSpace, length + 6);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found6;
- lookUp = Unsafe.Add(ref searchSpace, length + 5);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found5;
- lookUp = Unsafe.Add(ref searchSpace, length + 4);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found4;
- lookUp = Unsafe.Add(ref searchSpace, length + 3);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found3;
- lookUp = Unsafe.Add(ref searchSpace, length + 2);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found2;
- lookUp = Unsafe.Add(ref searchSpace, length + 1);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found1;
- lookUp = Unsafe.Add(ref searchSpace, length);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found;
- }
+ if (length >= 4)
+ {
+ length -= 4;
+
+ lookUp = Unsafe.Add(ref searchSpace, length + 3);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found3;
+ lookUp = Unsafe.Add(ref searchSpace, length + 2);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found2;
+ lookUp = Unsafe.Add(ref searchSpace, length + 1);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found1;
+ lookUp = Unsafe.Add(ref searchSpace, length);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found;
+ }
- if (length >= 4)
- {
- length -= 4;
+ while (length > 0)
+ {
+ length--;
- lookUp = Unsafe.Add(ref searchSpace, length + 3);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found3;
- lookUp = Unsafe.Add(ref searchSpace, length + 2);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found2;
- lookUp = Unsafe.Add(ref searchSpace, length + 1);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found1;
- lookUp = Unsafe.Add(ref searchSpace, length);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found;
+ lookUp = Unsafe.Add(ref searchSpace, length);
+ if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
+ goto Found;
+ }
}
-
- while (length > 0)
+ else
{
- length--;
-
- lookUp = Unsafe.Add(ref searchSpace, length);
- if (value0.Equals(lookUp) || value1.Equals(lookUp) || value2.Equals(lookUp))
- goto Found;
+ for (length--; length >= 0; length--)
+ {
+ lookUp = Unsafe.Add(ref searchSpace, length);
+ if ((object)lookUp is null)
+ {
+ if ((object)value0 is null || (object)value1 is null || (object)value2 is null)
+ {
+ goto Found;
+ }
+ }
+ else if (lookUp.Equals(value0) || lookUp.Equals(value1) || lookUp.Equals(value2))
+ {
+ goto Found;
+ }
+ }
}
+
return -1;
Found: // Workaround for https://github.com/dotnet/coreclr/issues/13549
goto Equal;
IntPtr index = (IntPtr)0; // Use IntPtr for arithmetic to avoid unnecessary 64->32->64 truncations
+ T lookUp0;
+ T lookUp1;
while (length >= 8)
{
length -= 8;
- if (!Unsafe.Add(ref first, index).Equals(Unsafe.Add(ref second, index)))
+ lookUp0 = Unsafe.Add(ref first, index);
+ lookUp1 = Unsafe.Add(ref second, index);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 1).Equals(Unsafe.Add(ref second, index + 1)))
+ lookUp0 = Unsafe.Add(ref first, index + 1);
+ lookUp1 = Unsafe.Add(ref second, index + 1);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 2).Equals(Unsafe.Add(ref second, index + 2)))
+ lookUp0 = Unsafe.Add(ref first, index + 2);
+ lookUp1 = Unsafe.Add(ref second, index + 2);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 3).Equals(Unsafe.Add(ref second, index + 3)))
+ lookUp0 = Unsafe.Add(ref first, index + 3);
+ lookUp1 = Unsafe.Add(ref second, index + 3);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 4).Equals(Unsafe.Add(ref second, index + 4)))
+ lookUp0 = Unsafe.Add(ref first, index + 4);
+ lookUp1 = Unsafe.Add(ref second, index + 4);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 5).Equals(Unsafe.Add(ref second, index + 5)))
+ lookUp0 = Unsafe.Add(ref first, index + 5);
+ lookUp1 = Unsafe.Add(ref second, index + 5);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 6).Equals(Unsafe.Add(ref second, index + 6)))
+ lookUp0 = Unsafe.Add(ref first, index + 6);
+ lookUp1 = Unsafe.Add(ref second, index + 6);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 7).Equals(Unsafe.Add(ref second, index + 7)))
+ lookUp0 = Unsafe.Add(ref first, index + 7);
+ lookUp1 = Unsafe.Add(ref second, index + 7);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
index += 8;
{
length -= 4;
- if (!Unsafe.Add(ref first, index).Equals(Unsafe.Add(ref second, index)))
+ lookUp0 = Unsafe.Add(ref first, index);
+ lookUp1 = Unsafe.Add(ref second, index);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 1).Equals(Unsafe.Add(ref second, index + 1)))
+ lookUp0 = Unsafe.Add(ref first, index + 1);
+ lookUp1 = Unsafe.Add(ref second, index + 1);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 2).Equals(Unsafe.Add(ref second, index + 2)))
+ lookUp0 = Unsafe.Add(ref first, index + 2);
+ lookUp1 = Unsafe.Add(ref second, index + 2);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
- if (!Unsafe.Add(ref first, index + 3).Equals(Unsafe.Add(ref second, index + 3)))
+ lookUp0 = Unsafe.Add(ref first, index + 3);
+ lookUp1 = Unsafe.Add(ref second, index + 3);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
index += 4;
while (length > 0)
{
- if (!Unsafe.Add(ref first, index).Equals(Unsafe.Add(ref second, index)))
+ lookUp0 = Unsafe.Add(ref first, index);
+ lookUp1 = Unsafe.Add(ref second, index);
+ if (!(lookUp0?.Equals(lookUp1) ?? (object)lookUp1 is null))
goto NotEqual;
index += 1;
length--;
minLength = secondLength;
for (int i = 0; i < minLength; i++)
{
- int result = Unsafe.Add(ref first, i).CompareTo(Unsafe.Add(ref second, i));
+ T lookUp = Unsafe.Add(ref second, i);
+ int result = (Unsafe.Add(ref first, i)?.CompareTo(lookUp) ?? (((object)lookUp is null) ? 0 : -1));
if (result != 0)
return result;
}