Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/coreclr/inc/switches.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,9 @@
#define CHAIN_LOOKUP
#endif // FEATURE_VIRTUAL_STUB_DISPATCH

#if !defined(FEATURE_PORTABLE_ENTRYPOINTS) && !defined(TARGET_X86)
#define FEATURE_PORTABLE_SHUFFLE_THUNKS
// FEATURE_SHUFFLE_THUNKS depends on CPUSTUBLINKER that is de-facto JIT
#if defined(FEATURE_JIT) && !defined(TARGET_X86)
#define FEATURE_SHUFFLE_THUNKS
#endif

#if defined(TARGET_UNIX) || !defined(TARGET_X86)
Expand Down
3 changes: 3 additions & 0 deletions src/coreclr/vm/arm64/cgencpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,9 @@ class StubLinkerCPU : public StubLinker

void EmitLoadStoreRegImm(DWORD flags, IntReg Xt, IntReg Xn, int offset=0, int log2Size = 3);
void EmitLoadStoreRegImm(DWORD flags, VecReg Vt, IntReg Xn, int offset=0);
#if !defined(FEATURE_SHUFFLE_THUNKS)
void EmitUnboxMethodStub(MethodDesc* pRealMD);
#endif // !defined(FEATURE_SHUFFLE_THUNKS)

void EmitRet(IntReg reg);
};
Expand Down
33 changes: 33 additions & 0 deletions src/coreclr/vm/arm64/stubs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1382,5 +1382,38 @@ PCODE DynamicHelpers::CreateDictionaryLookupHelper(LoaderAllocator * pAllocator,
#endif // FEATURE_STUBPRECODE_DYNAMIC_HELPERS
#endif // FEATURE_READYTORUN

#if !defined(FEATURE_SHUFFLE_THUNKS)
//
// This method unboxes the THIS pointer and then calls pRealMD
// If it's shared code for a method in a generic value class, then also extract the vtable pointer
// and pass it as an extra argument. Thus this stub generator really covers both
// - Unboxing, non-instantiating stubs
// - Unboxing, method-table-instantiating stubs
VOID StubLinkerCPU::EmitUnboxMethodStub(MethodDesc* pUnboxMD)
{
CONTRACTL
{
STANDARD_VM_CHECK;
PRECONDITION(!pUnboxMD->IsStatic());
}
CONTRACTL_END;

#ifdef FEATURE_INSTANTIATINGSTUB_AS_IL
_ASSERTE(!pUnboxMD->RequiresInstMethodTableArg());
#else
if (pUnboxMD->RequiresInstMethodTableArg())
{
EmitComputedInstantiatingMethodStub(pUnboxMD, NULL, NULL);
return;
}
#endif

//
// unboxing a value class simply means adding sizeof(void*) to the THIS pointer
//
EmitAddImm(IntReg(0), IntReg(0), sizeof(void*));
EmitCallManagedMethod(pUnboxMD, TRUE);
}
#endif // !defined(FEATURE_SHUFFLE_THUNKS)

#endif // #ifndef DACCESS_COMPILE
12 changes: 5 additions & 7 deletions src/coreclr/vm/comdelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

#ifndef DACCESS_COMPILE

#if defined(TARGET_X86)
#if !defined(FEATURE_SHUFFLE_THUNKS)

// Return an encoded shuffle entry describing a general register or stack offset that needs to be shuffled.
static UINT16 ShuffleOfs(INT ofs, UINT stackSizeDelta = 0)
Expand All @@ -56,9 +56,7 @@ static UINT16 ShuffleOfs(INT ofs, UINT stackSizeDelta = 0)

return static_cast<UINT16>(ofs);
}
#endif

#ifdef FEATURE_PORTABLE_SHUFFLE_THUNKS
#else // !defined(FEATURE_SHUFFLE_THUNKS)

// Iterator for extracting shuffle entries for argument desribed by an ArgLocDesc.
// Used when calculating shuffle array entries in GenerateShuffleArray below.
Expand Down Expand Up @@ -633,18 +631,18 @@ BOOL GenerateShuffleArrayPortable(MethodDesc* pMethodSrc, MethodDesc *pMethodDst

return TRUE;
}
#endif // FEATURE_PORTABLE_SHUFFLE_THUNKS
#endif // !defined(FEATURE_SHUFFLE_THUNKS)

#ifndef FEATURE_PORTABLE_ENTRYPOINTS
BOOL GenerateShuffleArray(MethodDesc* pInvoke, MethodDesc *pTargetMeth, SArray<ShuffleEntry> * pShuffleEntryArray)
{
STANDARD_VM_CONTRACT;

#ifdef FEATURE_PORTABLE_SHUFFLE_THUNKS
#ifdef FEATURE_SHUFFLE_THUNKS
// Portable default implementation
if (!GenerateShuffleArrayPortable(pInvoke, pTargetMeth, pShuffleEntryArray, ShuffleComputationType::DelegateShuffleThunk))
return FALSE;
#elif defined(TARGET_X86)
#elif defined(TARGET_X86) || defined(TARGET_ARM64) || defined(TARGET_AMD64)
ShuffleEntry entry;
ZeroMemory(&entry, sizeof(entry));

Expand Down
6 changes: 3 additions & 3 deletions src/coreclr/vm/i386/stublinkerx86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ VOID StubLinkerCPU::X64EmitMovXmmXmm(X86Reg destXmmreg, X86Reg srcXmmReg)
Emit8(REX_PREFIX_BASE | rex);

Emit16(0x280F);
Emit8(static_cast<UINT8>(0300 | (destXmmreg << 3) | srcXmmReg));
Emit8(static_cast<UINT8>(0300 | (destXmmreg << 3) | srcXmmReg));
}

//---------------------------------------------------------------
Expand Down Expand Up @@ -846,7 +846,7 @@ static const X86Reg c_argRegs[] = {
};
#endif

#ifdef TARGET_X86
#if !defined(FEATURE_SHUFFLE_THUNKS)
// This method unboxes the THIS pointer and then calls pRealMD
// If it's shared code for a method in a generic value class, then also extract the vtable pointer
// and pass it as an extra argument. Thus this stub generator really covers both
Expand Down Expand Up @@ -877,7 +877,7 @@ VOID StubLinkerCPU::EmitUnboxMethodStub(MethodDesc* pUnboxMD)
X86EmitAddReg(THIS_kREG, sizeof(void*));
EmitTailJumpToMethod(pUnboxMD);
}
#endif //TARGET_X86
#endif // !defined(FEATURE_SHUFFLE_THUNKS)

#if defined(FEATURE_SHARE_GENERIC_CODE) && defined(TARGET_AMD64)
VOID StubLinkerCPU::EmitComputedInstantiatingMethodStub(MethodDesc* pSharedMD, struct ShuffleEntry *pShuffleEntryArray, void* extraArg)
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/vm/i386/stublinkerx86.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,9 @@ class StubLinkerCPU : public StubLinker
#endif
}

#ifdef TARGET_X86
#if !defined(FEATURE_SHUFFLE_THUNKS)
VOID EmitUnboxMethodStub(MethodDesc* pRealMD);
#endif // TARGET_X86
#endif // !defined(FEATURE_SHUFFLE_THUNKS)
VOID EmitTailJumpToMethod(MethodDesc *pMD);
#ifdef TARGET_AMD64
VOID EmitLoadMethodAddressIntoAX(MethodDesc *pMD);
Expand Down
16 changes: 8 additions & 8 deletions src/coreclr/vm/prestub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1710,7 +1710,7 @@ Stub * MakeUnboxingStubWorker(MethodDesc *pMD)

_ASSERTE(pUnboxedMD != NULL && pUnboxedMD != pMD);

#ifdef FEATURE_PORTABLE_SHUFFLE_THUNKS
#ifdef FEATURE_SHUFFLE_THUNKS
StackSArray<ShuffleEntry> portableShuffle;
BOOL usePortableShuffle = FALSE;
if (!pUnboxedMD->RequiresInstMethodTableArg())
Expand Down Expand Up @@ -1746,24 +1746,24 @@ Stub * MakeUnboxingStubWorker(MethodDesc *pMD)
pstub = CreateUnboxingILStubForValueTypeMethods(pUnboxedMD);
#else // !FEATURE_PORTABLE_ENTRYPOINTS
#ifdef FEATURE_INSTANTIATINGSTUB_AS_IL
#ifndef FEATURE_PORTABLE_SHUFFLE_THUNKS
#ifndef FEATURE_SHUFFLE_THUNKS
if (pUnboxedMD->RequiresInstMethodTableArg())
#endif // !FEATURE_PORTABLE_SHUFFLE_THUNKS
#endif // !FEATURE_SHUFFLE_THUNKS
{
_ASSERTE(pUnboxedMD->RequiresInstMethodTableArg());
pstub = CreateUnboxingILStubForValueTypeMethods(pUnboxedMD);
}
#ifndef FEATURE_PORTABLE_SHUFFLE_THUNKS
#ifndef FEATURE_SHUFFLE_THUNKS
else
#endif // !FEATURE_PORTABLE_SHUFFLE_THUNKS
#endif // !FEATURE_SHUFFLE_THUNKS
#endif // FEATURE_INSTANTIATINGSTUB_AS_IL
#ifndef FEATURE_PORTABLE_SHUFFLE_THUNKS
#ifndef FEATURE_SHUFFLE_THUNKS
{
CPUSTUBLINKER sl;
sl.EmitUnboxMethodStub(pUnboxedMD);
pstub = sl.Link(pMD->GetLoaderAllocator()->GetStubHeap(), NEWSTUB_FL_NONE, "UnboxingStub");
}
#endif // !FEATURE_PORTABLE_SHUFFLE_THUNKS
#endif // !FEATURE_SHUFFLE_THUNKS
#endif // FEATURE_PORTABLE_ENTRYPOINTS
}
RETURN pstub;
Expand Down Expand Up @@ -1806,7 +1806,7 @@ Stub * MakeInstantiatingStubWorker(MethodDesc *pMD)
}
Stub *pstub = NULL;

#ifdef FEATURE_PORTABLE_SHUFFLE_THUNKS
#ifdef FEATURE_SHUFFLE_THUNKS
StackSArray<ShuffleEntry> portableShuffle;
if (GenerateShuffleArrayPortable(pMD, pSharedMD, &portableShuffle, ShuffleComputationType::InstantiatingStub))
{
Expand Down
Loading