diff --git a/src/coreclr/vm/comdelegate.cpp b/src/coreclr/vm/comdelegate.cpp index f33fcf994e1cfb..57b4c5f0b27b79 100644 --- a/src/coreclr/vm/comdelegate.cpp +++ b/src/coreclr/vm/comdelegate.cpp @@ -846,11 +846,16 @@ static Stub* CreateILDelegateShuffleThunk(MethodDesc* pDelegateMD, bool callTarg ILStubLinker stubLinker(pModule, signature, &typeContext, pDelegateMD, flags); ILCodeStream *pCode = stubLinker.NewCodeStream(ILStubLinker::kDispatch); + // Store the function pointer into local variable to avoid unnecessary register usage by JIT + DWORD methodPtr = pCode->NewLocal(ELEMENT_TYPE_I); + pCode->EmitLoadThis(); + pCode->EmitLDFLD(pCode->GetToken(CoreLibBinder::GetField(FIELD__DELEGATE__METHOD_PTR_AUX))); + pCode->EmitSTLOC(methodPtr); + for (unsigned i = 0; i < sig.NumFixedArgs(); ++i) pCode->EmitLDARG(i); - pCode->EmitLoadThis(); - pCode->EmitLDFLD(pCode->GetToken(CoreLibBinder::GetField(FIELD__DELEGATE__METHOD_PTR_AUX))); + pCode->EmitLDLOC(methodPtr); pCode->EmitCALLI(TOKEN_ILSTUB_TARGET_SIG, sig.NumFixedArgs(), sig.IsReturnTypeVoid() ? 0 : 1); pCode->EmitRET(); @@ -910,7 +915,7 @@ static PCODE SetupShuffleThunk(MethodTable * pDelMT, MethodDesc *pTargetMeth) MethodDesc *pMD = pClass->GetInvokeMethod(); -#if defined(FEATURE_PORTABLE_SHUFFLE_THUNKS) || defined(TARGET_X86) +#if 0 // We haven't already setup a shuffle thunk, go do it now (which will cache the result automatically). StackSArray rShuffleEntryArray; if (GenerateShuffleArray(pMD, pTargetMeth, &rShuffleEntryArray))