From: Christina Wadsworth Date: Mon, 22 Aug 2016 20:22:36 +0000 (-0700) Subject: ART: String DexCache asm fast path for x86 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=39c8a11a308bbfc96590ef0a897428b88abe81a6;p=android-x86%2Fart.git ART: String DexCache asm fast path for x86 In the entrypoints, before a string is looked up in the slow path (in the intern table), I added assembly to check the dex cache and return a string pointer if the string is already in the dex cache. Test: test-art-host Change-Id: Id0c337b380adc0b2bde5325745c928290d9da1b0 --- diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S index 2e9682e56..d685ace90 100644 --- a/runtime/arch/x86/quick_entrypoints_x86.S +++ b/runtime/arch/x86/quick_entrypoints_x86.S @@ -1108,7 +1108,44 @@ DEFINE_FUNCTION art_quick_alloc_object_region_tlab ALLOC_OBJECT_TLAB_SLOW_PATH artAllocObjectFromCodeRegionTLAB END_FUNCTION art_quick_alloc_object_region_tlab -ONE_ARG_DOWNCALL art_quick_resolve_string, artResolveStringFromCode, RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER +DEFINE_FUNCTION art_quick_resolve_string + SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx + movl FRAME_SIZE_SAVE_REFS_ONLY(%esp), %ecx // get referrer + movl ART_METHOD_DECLARING_CLASS_OFFSET(%ecx), %ecx // get declaring class + movl DECLARING_CLASS_DEX_CACHE_STRINGS_OFFSET(%ecx), %ecx // get string dex cache + movl LITERAL(STRING_DEX_CACHE_SIZE_MINUS_ONE), %edx + andl %eax, %edx + shl LITERAL(STRING_DEX_CACHE_ELEMENT_SIZE_SHIFT), %edx + addl %ecx, %edx + movlps (%edx), %xmm0 // load string idx and pointer to xmm0 + movd %xmm0, %ecx // extract pointer + pshufd LITERAL(0x55), %xmm0, %xmm0 // shuffle index into lowest bits + movd %xmm0, %edx // extract index + cmp %edx, %eax + jne .Lart_quick_resolve_string_slow_path +#ifdef USE_READ_BARRIER + testl LITERAL(LOCK_WORD_MARK_BIT_MASK_SHIFTED), MIRROR_OBJECT_LOCK_WORD_OFFSET(%ecx) + jz .Lart_quick_resolve_string_slow_path +#endif + movl %ecx, %eax + RESTORE_SAVE_REFS_ONLY_FRAME + ret + +.Lart_quick_resolve_string_slow_path: + // Outgoing argument set up + subl LITERAL(8), %esp // push padding + CFI_ADJUST_CFA_OFFSET(8) + pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() + CFI_ADJUST_CFA_OFFSET(4) + PUSH eax // pass arg1 + call SYMBOL(artResolveStringFromCode) + addl LITERAL(16), %esp // pop arguments + CFI_ADJUST_CFA_OFFSET(-16) + RESTORE_SAVE_REFS_ONLY_FRAME + RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER + +END_FUNCTION art_quick_resolve_string + ONE_ARG_DOWNCALL art_quick_initialize_static_storage, artInitializeStaticStorageFromCode, RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER ONE_ARG_DOWNCALL art_quick_initialize_type, artInitializeTypeFromCode, RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER ONE_ARG_DOWNCALL art_quick_initialize_type_and_verify_access, artInitializeTypeAndVerifyAccessFromCode, RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER