From 745e65c9595e5bab374ffd986d89c379bf6a2cac Mon Sep 17 00:00:00 2001 From: Pavel Afremov Date: Tue, 24 Jul 2007 17:57:28 +0400 Subject: [PATCH] Remove extra call of hythread_self which returns tls value from monitor enter/exit asm helpers. --- .../src/thread/helpers/thread_helpers_em64t.cpp | 17 +++++++++++ .../src/thread/helpers/thread_helpers_ia32.cpp | 30 ++++++++++++++----- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/vm/vmcore/src/thread/helpers/thread_helpers_em64t.cpp b/vm/vmcore/src/thread/helpers/thread_helpers_em64t.cpp index 24d8ad8..ddd27bd 100644 --- a/vm/vmcore/src/thread/helpers/thread_helpers_em64t.cpp +++ b/vm/vmcore/src/thread/helpers/thread_helpers_em64t.cpp @@ -44,7 +44,24 @@ * @return tm_self() in eax register */ char* gen_hythread_self_helper(char *ss) { +#ifdef HYTHREAD_FAST_TLS + // offset isn't too large so we can use 32-bit value + unsigned offset = hythread_get_hythread_offset_in_tls(); + // fs register uses for tls acces on linux x86-32 + //ss = mov(ss, rdx_opnd, M_Base_Opnd(fs_reg, 0x00)); + *ss++ = (char)0x64; + *ss++ = (char)0x48; + *ss++ = (char)0x8b; + *ss++ = (char)0x14; + *ss++ = (char)0x25; + *ss++ = (char)0x00; + *ss++ = (char)0x00; + *ss++ = (char)0x00; + *ss++ = (char)0x00; + ss = mov(ss, rax_opnd, M_Base_Opnd(rdx_reg, offset)); +#else ss = call(ss, (char *)hythread_self); +#endif return ss; } diff --git a/vm/vmcore/src/thread/helpers/thread_helpers_ia32.cpp b/vm/vmcore/src/thread/helpers/thread_helpers_ia32.cpp index 03061ca..c1c7a33 100644 --- a/vm/vmcore/src/thread/helpers/thread_helpers_ia32.cpp +++ b/vm/vmcore/src/thread/helpers/thread_helpers_ia32.cpp @@ -40,14 +40,28 @@ * @return tm_self() in eax register */ char* gen_hythread_self_helper(char *ss) { -#ifdef FS14_TLS_USE - //ss = mov(ss, eax_opnd, M_Base_Opnd(fs_reg, 0x14)); - *ss++ = (char)0x64; - *ss++ = (char)0xa1; - *ss++ = (char)0x14; - *ss++ = (char)0x00; - *ss++ = (char)0x00; - *ss++ = (char)0x00; +#ifdef HYTHREAD_FAST_TLS +# ifdef FS14_TLS_USE + //ss = mov(ss, eax_opnd, M_Base_Opnd(fs_reg, 0x14)); + *ss++ = (char)0x64; + *ss++ = (char)0xa1; + *ss++ = (char)0x14; + *ss++ = (char)0x00; + *ss++ = (char)0x00; + *ss++ = (char)0x00; +# else + unsigned offset = hythread_get_hythread_offset_in_tls(); + // gs register uses for tls acces on linux x86-32 + //ss = mov(ss, edx_opnd, M_Base_Opnd(gs_reg, 0x00)); + *ss++ = (char)0x65; + *ss++ = (char)0x8b; + *ss++ = (char)0x15; + *ss++ = (char)0x00; + *ss++ = (char)0x00; + *ss++ = (char)0x00; + *ss++ = (char)0x00; + ss = mov(ss, eax_opnd, M_Base_Opnd(edx_reg, offset)); +# endif #else ss = call(ss, (char *)hythread_self); #endif -- 1.5.0.3