diff options
author | Sujin Kim <sjsujin.kim@samsung.com> | 2017-09-13 09:55:55 +0900 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2017-09-12 17:55:55 -0700 |
commit | 5f6528fa6ff08c18de880d4c343164c031f89525 (patch) | |
tree | 0f9ae00597f5dcbe16b1556ea4ba44beead51136 /src/vm | |
parent | 1ac52ef489061d2ed870f6d1380336f079b71295 (diff) | |
download | coreclr-5f6528fa6ff08c18de880d4c343164c031f89525.tar.gz coreclr-5f6528fa6ff08c18de880d4c343164c031f89525.tar.bz2 coreclr-5f6528fa6ff08c18de880d4c343164c031f89525.zip |
[RyuJIT/ARM32] Implement CreateDictionaryLookupHelper only via helper (#13733)
* [RyuJIT/ARM32] Implement CreateDictionaryLookupHelper only via run-time helper
Implement CreateDictionaryLookupHelper only via run-time helper
* Add assertion for checking CORINFO_USEHELPER
Diffstat (limited to 'src/vm')
-rw-r--r-- | src/vm/arm/stubs.cpp | 33 | ||||
-rw-r--r-- | src/vm/jitinterface.cpp | 3 | ||||
-rw-r--r-- | src/vm/prestub.cpp | 4 |
3 files changed, 32 insertions, 8 deletions
diff --git a/src/vm/arm/stubs.cpp b/src/vm/arm/stubs.cpp index 9b8d6afb29..4bc1b2c1ea 100644 --- a/src/vm/arm/stubs.cpp +++ b/src/vm/arm/stubs.cpp @@ -3604,10 +3604,8 @@ PCODE DynamicHelpers::CreateHelper(LoaderAllocator * pAllocator, TADDR arg, PCOD END_DYNAMIC_HELPER_EMIT(); } -PCODE DynamicHelpers::CreateHelperWithArg(LoaderAllocator * pAllocator, TADDR arg, PCODE target) +void DynamicHelpers::EmitHelperWithArg(BYTE*& p, LoaderAllocator * pAllocator, TADDR arg, PCODE target) { - BEGIN_DYNAMIC_HELPER_EMIT(18); - // mov r1, arg MovRegImm(p, 1, arg); p += 8; @@ -3619,6 +3617,13 @@ PCODE DynamicHelpers::CreateHelperWithArg(LoaderAllocator * pAllocator, TADDR ar // bx r12 *(WORD *)p = 0x4760; p += 2; +} + +PCODE DynamicHelpers::CreateHelperWithArg(LoaderAllocator * pAllocator, TADDR arg, PCODE target) +{ + BEGIN_DYNAMIC_HELPER_EMIT(18); + + EmitHelperWithArg(p, pAllocator, arg, target); END_DYNAMIC_HELPER_EMIT(); } @@ -3767,8 +3772,26 @@ PCODE DynamicHelpers::CreateDictionaryLookupHelper(LoaderAllocator * pAllocator, { STANDARD_VM_CONTRACT; - // TODO (NYI) - ThrowHR(E_NOTIMPL); + PCODE helperAddress = (pLookup->helper == CORINFO_HELP_RUNTIMEHANDLE_METHOD ? + GetEEFuncEntryPoint(JIT_GenericHandleMethodWithSlotAndModule) : + GetEEFuncEntryPoint(JIT_GenericHandleClassWithSlotAndModule)); + + GenericHandleArgs * pArgs = (GenericHandleArgs *)(void *)pAllocator->GetDynamicHelpersHeap()->AllocAlignedMem(sizeof(GenericHandleArgs), DYNAMIC_HELPER_ALIGNMENT); + pArgs->dictionaryIndexAndSlot = dictionaryIndexAndSlot; + pArgs->signature = pLookup->signature; + pArgs->module = (CORINFO_MODULE_HANDLE)pModule; + + // It's available only via the run-time helper function, + // since optimization cases are not yet implemented. + assert(pLookup->indirections == CORINFO_USEHELPER); + + BEGIN_DYNAMIC_HELPER_EMIT(18); + + EmitHelperWithArg(p, pAllocator, (TADDR)pArgs, helperAddress); + + END_DYNAMIC_HELPER_EMIT(); + + // @TODO : Additional implementation is required for optimization cases. } #endif // FEATURE_READYTORUN diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index 4301873df8..aa1365ca3d 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -3132,9 +3132,6 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr #ifdef FEATURE_READYTORUN_COMPILER if (IsReadyToRunCompilation()) { -#if defined(_TARGET_ARM_) - ThrowHR(E_NOTIMPL); /* TODO - NYI */ -#endif pResultLookup->lookupKind.runtimeLookupArgs = NULL; switch (entryKind) diff --git a/src/vm/prestub.cpp b/src/vm/prestub.cpp index 0109316a01..f96135008d 100644 --- a/src/vm/prestub.cpp +++ b/src/vm/prestub.cpp @@ -2586,6 +2586,9 @@ void ProcessDynamicDictionaryLookup(TransitionBlock * pTransitionBlock // // Optimization cases // + // TODO-ARM : If the optimization cases are implemented in CreateDictionaryLookupHelper, + // It's ifndef for ARM will be removed. +#ifndef _TARGET_ARM_ if (signatureKind == ENCODE_TYPE_HANDLE) { SigPointer sigptr(pBlob, -1); @@ -2628,6 +2631,7 @@ void ProcessDynamicDictionaryLookup(TransitionBlock * pTransitionBlock return; } } +#endif // !_TARGET_ARM_ if (pContextMT != NULL && pContextMT->GetNumDicts() > 0xFFFF) ThrowHR(COR_E_BADIMAGEFORMAT); |