summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAhson Khan <ahkha@microsoft.com>2017-12-14 14:34:42 -0800
committerGitHub <noreply@github.com>2017-12-14 14:34:42 -0800
commit0af608123cfe6cedf4e38d14792f620ba5de4faf (patch)
tree68b4a8e267817fcd630f03f3f3fc6c28d0fb5705 /src
parent5d91c4d2cc8fe60bad20cdfdf2e5f239bc024061 (diff)
downloadcoreclr-0af608123cfe6cedf4e38d14792f620ba5de4faf.tar.gz
coreclr-0af608123cfe6cedf4e38d14792f620ba5de4faf.tar.bz2
coreclr-0af608123cfe6cedf4e38d14792f620ba5de4faf.zip
Adding Unsafe API Add nuint that is used by SpanHelpers (#15527)
* Adding Unsafe API Add nuint that is used by SpanHelpers * Change elementOffset to IntPtr in method signature.
Diffstat (limited to 'src')
-rw-r--r--src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs16
-rw-r--r--src/vm/jitinterface.cpp23
-rw-r--r--src/vm/metasig.h1
-rw-r--r--src/vm/mscorlib.h1
4 files changed, 41 insertions, 0 deletions
diff --git a/src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs b/src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs
index 8e6c5da47b..1aae1627e5 100644
--- a/src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs
+++ b/src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs
@@ -110,6 +110,22 @@ namespace Internal.Runtime.CompilerServices
}
/// <summary>
+ /// Adds an element offset to the given reference.
+ /// </summary>
+ [Intrinsic]
+ [NonVersionable]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ref T Add<T>(ref T source, IntPtr elementOffset)
+ {
+#if CORECLR
+ typeof(T).ToString(); // Type token used by the actual method body
+ throw new PlatformNotSupportedException();
+#else
+ return ref AddByteOffset(ref source, (IntPtr)(elementOffset * (nint)SizeOf<T>()));
+#endif
+ }
+
+ /// <summary>
/// Adds an element offset to the given pointer.
/// </summary>
[Intrinsic]
diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp
index 9bd710fb0b..d584f213af 100644
--- a/src/vm/jitinterface.cpp
+++ b/src/vm/jitinterface.cpp
@@ -7166,6 +7166,29 @@ bool getILIntrinsicImplementationForUnsafe(MethodDesc * ftn,
methInfo->options = (CorInfoOptions)0;
return true;
}
+ else if (tk == MscorlibBinder::GetMethod(METHOD__UNSAFE__BYREF_INTPTR_ADD)->GetMemberDef())
+ {
+ mdToken tokGenericArg = FindGenericMethodArgTypeSpec(MscorlibBinder::GetModule()->GetMDImport());
+
+ static BYTE ilcode[] = { CEE_LDARG_1,
+ CEE_PREFIX1, (CEE_SIZEOF & 0xFF), 0,0,0,0,
+ CEE_MUL,
+ CEE_LDARG_0,
+ CEE_ADD,
+ CEE_RET };
+
+ ilcode[3] = (BYTE)(tokGenericArg);
+ ilcode[4] = (BYTE)(tokGenericArg >> 8);
+ ilcode[5] = (BYTE)(tokGenericArg >> 16);
+ ilcode[6] = (BYTE)(tokGenericArg >> 24);
+
+ methInfo->ILCode = const_cast<BYTE*>(ilcode);
+ methInfo->ILCodeSize = sizeof(ilcode);
+ methInfo->maxStack = 2;
+ methInfo->EHcount = 0;
+ methInfo->options = (CorInfoOptions)0;
+ return true;
+ }
else if (tk == MscorlibBinder::GetMethod(METHOD__UNSAFE__BYREF_ADD_BYTE_OFFSET)->GetMemberDef())
{
static BYTE ilcode[] = { CEE_LDARG_0, CEE_LDARG_1, CEE_ADD, CEE_RET };
diff --git a/src/vm/metasig.h b/src/vm/metasig.h
index bbd326ebe3..9976ed12f2 100644
--- a/src/vm/metasig.h
+++ b/src/vm/metasig.h
@@ -293,6 +293,7 @@ DEFINE_METASIG(GM(PtrVoid_T_RetVoid, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, P(v) M(0)
DEFINE_METASIG(GM(RefTFrom_RetRefTTo, IMAGE_CEE_CS_CALLCONV_DEFAULT, 2, r(M(0)), r(M(1))))
DEFINE_METASIG(GM(Obj_RetT, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, j, M(0)))
DEFINE_METASIG(GM(RefT_Int_RetRefT, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, r(M(0)) i, r(M(0))))
+DEFINE_METASIG(GM(RefT_IntPtr_RetRefT, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, r(M(0)) I, r(M(0))))
DEFINE_METASIG(GM(PtrVoid_Int_RetPtrVoid, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, P(v) i, P(v)))
DEFINE_METASIG_T(SM(SafeHandle_RefBool_RetIntPtr, C(SAFE_HANDLE) r(F), I ))
diff --git a/src/vm/mscorlib.h b/src/vm/mscorlib.h
index 39038415aa..511271d074 100644
--- a/src/vm/mscorlib.h
+++ b/src/vm/mscorlib.h
@@ -775,6 +775,7 @@ DEFINE_METHOD(UNSAFE, SIZEOF, SizeOf, NoSig)
DEFINE_METHOD(UNSAFE, BYREF_AS, As, GM_RefTFrom_RetRefTTo)
DEFINE_METHOD(UNSAFE, OBJECT_AS, As, GM_Obj_RetT)
DEFINE_METHOD(UNSAFE, BYREF_ADD, Add, GM_RefT_Int_RetRefT)
+DEFINE_METHOD(UNSAFE, BYREF_INTPTR_ADD, Add, GM_RefT_IntPtr_RetRefT)
DEFINE_METHOD(UNSAFE, PTR_ADD, Add, GM_PtrVoid_Int_RetPtrVoid)
DEFINE_METHOD(UNSAFE, BYREF_BYTE_OFFSET, ByteOffset, NoSig)
DEFINE_METHOD(UNSAFE, BYREF_ADD_BYTE_OFFSET, AddByteOffset, NoSig)