ART: Clean up x86 asm in dex cache entrypoints
Change-Id: Icc315d1d5da16cc67eee3c0557cae5781623f3b6
Test: test-art-host
diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S
index 282f10d..503be9d 100644
--- a/runtime/arch/x86/quick_entrypoints_x86.S
+++ b/runtime/arch/x86/quick_entrypoints_x86.S
@@ -1109,18 +1109,15 @@
END_FUNCTION art_quick_alloc_object_region_tlab
DEFINE_FUNCTION art_quick_resolve_string
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx
- movl FRAME_SIZE_SAVE_REFS_ONLY(%esp), %ecx // get referrer
+ movl 4(%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
+ movlps (%ecx, %edx, STRING_DEX_CACHE_ELEMENT_SIZE), %xmm0 // load string idx and ptr 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
movl %ecx, %eax
@@ -1128,10 +1125,10 @@
cmpl LITERAL(0), %fs:THREAD_IS_GC_MARKING_OFFSET
jne .Lart_quick_resolve_string_marking
#endif
- RESTORE_SAVE_REFS_ONLY_FRAME
ret
.Lart_quick_resolve_string_slow_path:
// Outgoing argument set up
+ SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx
subl LITERAL(8), %esp // push padding
CFI_ADJUST_CFA_OFFSET(8)
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
@@ -1143,6 +1140,7 @@
RESTORE_SAVE_REFS_ONLY_FRAME
RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER
.Lart_quick_resolve_string_marking:
+ SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx
testl LITERAL(LOCK_WORD_MARK_BIT_MASK_SHIFTED), MIRROR_OBJECT_LOCK_WORD_OFFSET(%eax)
jnz .Lart_quick_resolve_string_no_rb
subl LITERAL(12), %esp // alignment padding
diff --git a/runtime/generated/asm_support_gen.h b/runtime/generated/asm_support_gen.h
index 5c98ea6..03f5bf6 100644
--- a/runtime/generated/asm_support_gen.h
+++ b/runtime/generated/asm_support_gen.h
@@ -80,8 +80,8 @@
DEFINE_CHECK_EQ(static_cast<int32_t>(STRING_DEX_CACHE_SIZE_MINUS_ONE), (static_cast<int32_t>(art::mirror::DexCache::kDexCacheStringCacheSize - 1)))
#define STRING_DEX_CACHE_HASH_BITS 10
DEFINE_CHECK_EQ(static_cast<int32_t>(STRING_DEX_CACHE_HASH_BITS), (static_cast<int32_t>(art::LeastSignificantBit(art::mirror::DexCache::kDexCacheStringCacheSize))))
-#define STRING_DEX_CACHE_ELEMENT_SIZE 0x8
-DEFINE_CHECK_EQ(static_cast<size_t>(STRING_DEX_CACHE_ELEMENT_SIZE), (static_cast<size_t>(sizeof(art::mirror::StringDexCachePair))))
+#define STRING_DEX_CACHE_ELEMENT_SIZE 8
+DEFINE_CHECK_EQ(static_cast<int32_t>(STRING_DEX_CACHE_ELEMENT_SIZE), (static_cast<int32_t>(sizeof(art::mirror::StringDexCachePair))))
#define MIN_LARGE_OBJECT_THRESHOLD 0x3000
DEFINE_CHECK_EQ(static_cast<size_t>(MIN_LARGE_OBJECT_THRESHOLD), (static_cast<size_t>(art::gc::Heap::kMinLargeObjectThreshold)))
#define LOCK_WORD_STATE_SHIFT 30