singrdk/base/Imported/Bartok/System/Buffer.cs

131 lines
4.4 KiB
C#
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
//
// Note: These routines assume that the processor supports
// 32-bit aligned accesses. Migration to non-x86 platforms will
// need to examine and tune the implementations accordingly.
//
#if ISA_IX
#define USE_EXTERNAL_MEMORY_OPERATIONS
#endif
namespace System
{
using System;
using System.Runtime.CompilerServices;
//| <include path='docs/doc[@for="Buffer"]/*' />
[NoCCtor]
[CLSCompliant(false)]
[AccessedByRuntime("output to header: defined in c++/asm")]
public sealed partial class Buffer
{
private Buffer() {
}
[RequiredByBartok]
internal static unsafe void MoveMemoryVolatile(byte* dmem, byte* smem,
int size) {
MoveMemoryImpl(dmem, smem, size, true);
}
// Note that this is public (and shouldn't be) so that we can link
// bitter.sg against buffer.cs. This method will be made internal
// when we can compile the .cs files with Sing#.
//
#if USE_EXTERNAL_MEMORY_OPERATIONS
[AccessedByRuntime("output to header: defined in c++")]
[MethodImpl(MethodImplOptions.InternalCall)]
[StackBound(64)]
[NoHeapAllocation]
[RequiredByBartok]
public static unsafe extern void MoveMemory(byte* dmem, byte* smem,
int size);
#else // !USE_EXTERNAL_MEMORY_OPERATIONS
[NoHeapAllocation]
[RequiredByBartok]
public static unsafe void MoveMemory(byte* dmem, byte* smem,
int size) {
MoveMemoryImpl(dmem, smem, size, false);
}
#endif // !USE_EXTERNAL_MEMORY_OPERATIONS
// Other parts of class must define this static method:
// [NoHeapAllocation]
//private static unsafe void MoveMemoryImpl(byte* dmem, byte* smem,
// int size, bool vol);
#if USE_EXTERNAL_MEMORY_OPERATIONS
[AccessedByRuntime("output to header: defined in c++")]
[MethodImpl(MethodImplOptions.InternalCall)]
[StackBound(64)]
[NoHeapAllocation]
[RequiredByBartok]
public static unsafe extern void ZeroMemory(byte* dst, int len);
#else // !USE_EXTERNAL_MEMORY_OPERATIONS
[NoHeapAllocation]
[RequiredByBartok]
public static unsafe void ZeroMemory(byte* dest, int len)
{
InitMemoryImpl(dest, 0, len, false);
}
#endif // !USE_EXTERNAL_MEMORY_OPERATIONS
[NoHeapAllocation]
[RequiredByBartok]
internal unsafe static void InitMemory(byte* dest, byte value,
int len) {
InitMemoryImpl(dest, value, len, false);
}
[NoHeapAllocation]
[RequiredByBartok]
internal unsafe static void InitMemoryVolatile(byte* dest, byte value,
int len) {
InitMemoryImpl(dest, value, len, true);
}
// Other parts of class must define this static method:
// [NoHeapAllocation]
// internal unsafe static void InitMemoryImpl(byte* dest, byte value,
// int len, bool vol);
#if USE_EXTERNAL_MEMORY_OPERATIONS
[AccessedByRuntime("output to header: defined in asm")]
[MethodImpl(MethodImplOptions.InternalCall)]
[StackBound(32)]
[NoHeapAllocation]
internal static unsafe extern void ZeroPages(byte* dst, int len);
[AccessedByRuntime("output to header: defined in asm")]
[MethodImpl(MethodImplOptions.InternalCall)]
[StackBound(32)]
[NoHeapAllocation]
internal static unsafe extern void CopyPages(byte* dst, byte *src, int len);
#else
[AccessedByRuntime("output to header: available in asm")]
[NoHeapAllocation]
public static unsafe void ZeroPages(byte* dest, int len)
{
InitMemoryImpl(dest, 0, len, false);
}
[AccessedByRuntime("output to header: available in asm")]
[NoHeapAllocation]
public static unsafe void CopyPages(byte* dmem, byte* smem, int size)
{
MoveMemoryImpl(dmem, smem, size, false);
}
#endif
}
}