From 777d7d11e164df887e77055f130207f8a46753c6 Mon Sep 17 00:00:00 2001 From: Pavel Afremov Date: Fri, 16 Mar 2007 17:45:15 +0300 Subject: [PATCH] Remove extra call of hythread_self which returns tls value from monitor enter/exit asm helpers. --- vm/thread/src/thread_helpers_em64t.cpp | 16 ++++++++++++++++ vm/thread/src/thread_helpers_ia32.cpp | 29 +++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/vm/thread/src/thread_helpers_em64t.cpp b/vm/thread/src/thread_helpers_em64t.cpp old mode 100644 new mode 100755 index daa0d51..d4710be --- a/vm/thread/src/thread_helpers_em64t.cpp +++ b/vm/thread/src/thread_helpers_em64t.cpp @@ -45,7 +45,23 @@ #include * @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(); + //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/thread/src/thread_helpers_ia32.cpp b/vm/thread/src/thread_helpers_ia32.cpp old mode 100644 new mode 100755 index 20be610..a57c8af --- a/vm/thread/src/thread_helpers_ia32.cpp +++ b/vm/thread/src/thread_helpers_ia32.cpp @@ -41,14 +41,27 @@ #include * @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(); + //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.4.2