<Compile Include="$(MSBuildThisFileDirectory)Internal\IO\File.Windows.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Microsoft\Win32\SafeHandles\SafeFileHandle.Windows.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Microsoft\Win32\SafeHandles\SafeFindHandle.Windows.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)System\Buffer.Windows.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.Windows.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Diagnostics\DebugProvider.Windows.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Globalization\CalendarData.Windows.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Interop\Unix\System.Native\Interop.Write.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Internal\IO\File.Unix.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Microsoft\Win32\SafeHandles\SafeFileHandle.Unix.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)System\Buffer.Unix.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\DateTime.Unix.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Diagnostics\DebugProvider.Unix.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.Unix.cs" />
--- /dev/null
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+#if BIT64
+using nuint = System.UInt64;
+#else
+using nuint = System.UInt32;
+#endif
+
+namespace System
+{
+ public static partial class Buffer
+ {
+#if ARM64
+ // Managed code is currently faster than glibc unoptimized memmove
+ // TODO-ARM64-UNIX-OPT revisit when glibc optimized memmove is in Linux distros
+ // https://github.com/dotnet/coreclr/issues/13844
+ private const nuint MemmoveNativeThreshold = ulong.MaxValue;
+#elif ARM
+ private const nuint MemmoveNativeThreshold = 512;
+#else
+ private const nuint MemmoveNativeThreshold = 2048;
+#endif
+ }
+}
\ No newline at end of file
--- /dev/null
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+#if BIT64
+using nuint = System.UInt64;
+#else
+using nuint = System.UInt32;
+#endif
+
+namespace System
+{
+ public static partial class Buffer
+ {
+#if ARM64
+ // Determine optimal value for Windows.
+ // https://github.com/dotnet/coreclr/issues/13843
+ private const nuint MemmoveNativeThreshold = ulong.MaxValue;
+#else
+ private const nuint MemmoveNativeThreshold = 2048;
+#endif
+ }
+}
\ No newline at end of file
// This method has different signature for x64 and other platforms and is done for performance reasons.
internal static unsafe void Memmove(byte* dest, byte* src, nuint len)
{
-#if AMD64 || (BIT32 && !ARM)
- const nuint CopyThreshold = 2048;
-#elif ARM64
-#if PLATFORM_WINDOWS
- // Determined optimal value for Windows.
- // https://github.com/dotnet/coreclr/issues/13843
- const nuint CopyThreshold = ulong.MaxValue;
-#else // PLATFORM_WINDOWS
- // Managed code is currently faster than glibc unoptimized memmove
- // TODO-ARM64-UNIX-OPT revisit when glibc optimized memmove is in Linux distros
- // https://github.com/dotnet/coreclr/issues/13844
- const nuint CopyThreshold = ulong.MaxValue;
-#endif // PLATFORM_WINDOWS
-#else
- const nuint CopyThreshold = 512;
-#endif // AMD64 || (BIT32 && !ARM)
-
// P/Invoke into the native version when the buffers are overlapping.
if (((nuint)dest - (nuint)src < len) || ((nuint)src - (nuint)dest < len))
{
MCPY05:
// PInvoke to the native version when the copy length exceeds the threshold.
- if (len > CopyThreshold)
+ if (len > MemmoveNativeThreshold)
{
goto PInvoke;
}
// Copy 64-bytes at a time until the remainder is less than 64.
// If remainder is greater than 16 bytes, then jump to MCPY00. Otherwise, unconditionally copy the last 16 bytes and return.
- Debug.Assert(len > 64 && len <= CopyThreshold);
+ Debug.Assert(len > 64 && len <= MemmoveNativeThreshold);
nuint n = len >> 6;
MCPY06:
// This method has different signature for x64 and other platforms and is done for performance reasons.
private static void Memmove(ref byte dest, ref byte src, nuint len)
{
-#if AMD64 || (BIT32 && !ARM)
- const nuint CopyThreshold = 2048;
-#elif ARM64
-#if PLATFORM_WINDOWS
- // Determined optimal value for Windows.
- // https://github.com/dotnet/coreclr/issues/13843
- const nuint CopyThreshold = ulong.MaxValue;
-#else // PLATFORM_WINDOWS
- // Managed code is currently faster than glibc unoptimized memmove
- // TODO-ARM64-UNIX-OPT revisit when glibc optimized memmove is in Linux distros
- // https://github.com/dotnet/coreclr/issues/13844
- const nuint CopyThreshold = ulong.MaxValue;
-#endif // PLATFORM_WINDOWS
-#else
- const nuint CopyThreshold = 512;
-#endif // AMD64 || (BIT32 && !ARM)
-
// P/Invoke into the native version when the buffers are overlapping.
if (((nuint)Unsafe.ByteOffset(ref src, ref dest) < len) || ((nuint)Unsafe.ByteOffset(ref dest, ref src) < len))
{
MCPY05:
// PInvoke to the native version when the copy length exceeds the threshold.
- if (len > CopyThreshold)
+ if (len > MemmoveNativeThreshold)
{
goto PInvoke;
}
// Copy 64-bytes at a time until the remainder is less than 64.
// If remainder is greater than 16 bytes, then jump to MCPY00. Otherwise, unconditionally copy the last 16 bytes and return.
- Debug.Assert(len > 64 && len <= CopyThreshold);
+ Debug.Assert(len > 64 && len <= MemmoveNativeThreshold);
nuint n = len >> 6;
MCPY06: