Improve performance of CTI on windows.
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Oct 2008 06:16:18 +0000 (06:16 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Oct 2008 06:16:18 +0000 (06:16 +0000)
Reviewed by Geoff Garen

Currently on platforms where the compiler doesn't allow us to safely
index relative to the address of a parameter we need to actually
provide a pointer to CTI runtime call arguments.  This patch improves
performance in this case by making the CTI logic for restoring this
parameter much less conservative by only resetting it before we actually
make a call, rather than between each and every SF bytecode we generate
code for.

This results in a 3.6% on the v8 benchmark when compiled with MSVC.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@37138 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/VM/CTI.cpp
JavaScriptCore/VM/CTI.h
JavaScriptCore/masm/X86Assembler.h
JavaScriptCore/wtf/Platform.h

index a795778..93c443e 100644 (file)
@@ -1,3 +1,29 @@
+2008-09-30  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Geoff Garen.
+
+        Improve performance of CTI on windows.
+
+        Currently on platforms where the compiler doesn't allow us to safely
+        index relative to the address of a parameter we need to actually
+        provide a pointer to CTI runtime call arguments.  This patch improves
+        performance in this case by making the CTI logic for restoring this
+        parameter much less conservative by only resetting it before we actually
+        make a call, rather than between each and every SF bytecode we generate
+        code for.
+
+        This results in a 3.6% progression on the v8 benchmark when compiled with MSVC.
+
+        * VM/CTI.cpp:
+        (JSC::CTI::emitCall):
+        (JSC::CTI::compileOpCall):
+        (JSC::CTI::privateCompileMainPass):
+        (JSC::CTI::privateCompileSlowCases):
+        (JSC::CTI::privateCompilePutByIdTransition):
+        * VM/CTI.h:
+        * masm/X86Assembler.h:
+        * wtf/Platform.h:
+
 2008-09-30  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Oliver Hunt.
index 46f915f..a5ad7a5 100644 (file)
@@ -292,6 +292,7 @@ void CTI::printOpcodeOperandTypes(unsigned src1, unsigned src2)
 
 ALWAYS_INLINE X86Assembler::JmpSrc CTI::emitCall(unsigned opcodeIndex, X86::RegisterID r)
 {
+    m_jit.emitRestoreArgumentReference();
     X86Assembler::JmpSrc call = m_jit.emitCall(r);
     m_calls.append(CallRecord(call, opcodeIndex));
     emitDebugExceptionCheck();
@@ -304,6 +305,7 @@ ALWAYS_INLINE X86Assembler::JmpSrc CTI::emitCall(unsigned opcodeIndex, CTIHelper
 #if ENABLE(SAMPLING_TOOL)
     m_jit.movl_i32m(1, &inCalledCode);
 #endif
+    m_jit.emitRestoreArgumentReference();
     X86Assembler::JmpSrc call = m_jit.emitCall();
     m_calls.append(CallRecord(call, helper, opcodeIndex));
     emitDebugExceptionCheck();
@@ -319,6 +321,7 @@ ALWAYS_INLINE X86Assembler::JmpSrc CTI::emitCall(unsigned opcodeIndex, CTIHelper
 #if ENABLE(SAMPLING_TOOL)
     m_jit.movl_i32m(1, &inCalledCode);
 #endif
+    m_jit.emitRestoreArgumentReference();
     X86Assembler::JmpSrc call = m_jit.emitCall();
     m_calls.append(CallRecord(call, helper, opcodeIndex));
     emitDebugExceptionCheck();
@@ -334,6 +337,7 @@ ALWAYS_INLINE X86Assembler::JmpSrc CTI::emitCall(unsigned opcodeIndex, CTIHelper
 #if ENABLE(SAMPLING_TOOL)
     m_jit.movl_i32m(1, &inCalledCode);
 #endif
+    m_jit.emitRestoreArgumentReference();
     X86Assembler::JmpSrc call = m_jit.emitCall();
     m_calls.append(CallRecord(call, helper, opcodeIndex));
     emitDebugExceptionCheck();
@@ -349,6 +353,7 @@ ALWAYS_INLINE X86Assembler::JmpSrc CTI::emitCall(unsigned opcodeIndex, CTIHelper
 #if ENABLE(SAMPLING_TOOL)
     m_jit.movl_i32m(1, &inCalledCode);
 #endif
+    m_jit.emitRestoreArgumentReference();
     X86Assembler::JmpSrc call = m_jit.emitCall();
     m_calls.append(CallRecord(call, helper, opcodeIndex));
     emitDebugExceptionCheck();
@@ -364,6 +369,7 @@ ALWAYS_INLINE X86Assembler::JmpSrc CTI::emitCall(unsigned opcodeIndex, CTIHelper
 #if ENABLE(SAMPLING_TOOL)
     m_jit.movl_i32m(1, &inCalledCode);
 #endif
+    m_jit.emitRestoreArgumentReference();
     X86Assembler::JmpSrc call = m_jit.emitCall();
     m_calls.append(CallRecord(call, helper, opcodeIndex));
     emitDebugExceptionCheck();
@@ -507,7 +513,6 @@ void CTI::compileOpCall(Instruction* instruction, unsigned i, CompileOpCallType
     if (type == OpCallEval) {
         emitGetPutArg(instruction[i + 2].u.operand, 0, X86::ecx);
         emitCall(i, Machine::cti_op_call_eval);
-        m_jit.emitRestoreArgumentReference();
 
         emitGetCTIParam(CTI_ARGS_r, X86::edi); // edi := r
 
@@ -849,7 +854,6 @@ void CTI::privateCompileMainPass()
 #endif
 
         ASSERT_WITH_MESSAGE(m_machine->isOpcode(instruction[i].u.opcode), "privateCompileMainPass gone bad @ %d", i);
-        m_jit.emitRestoreArgumentReference();
         switch (m_machine->getOpcodeID(instruction[i].u.opcode)) {
         case op_mov: {
             unsigned src = instruction[i + 2].u.operand;
@@ -2021,7 +2025,6 @@ void CTI::privateCompileSlowCases()
     Instruction* instruction = m_codeBlock->instructions.begin();
     for (Vector<SlowCaseEntry>::iterator iter = m_slowCases.begin(); iter != m_slowCases.end(); ++iter) {
         unsigned i = iter->to;
-        m_jit.emitRestoreArgumentReference();
         switch (m_machine->getOpcodeID(instruction[i].u.opcode)) {
         case op_add: {
             unsigned dst = instruction[i + 1].u.operand;
@@ -2470,7 +2473,6 @@ void CTI::privateCompileSlowCases()
         case op_call_eval:
         case op_construct: {
             m_jit.link(iter->from, m_jit.label());
-            m_jit.emitRestoreArgumentReference();
 
             // We jump to this slow case if the ctiCode for the codeBlock has not yet been generated; compile it now.
             emitCall(i, Machine::cti_vm_compile);
index b2b76c7..0a66cf7 100644 (file)
@@ -245,6 +245,11 @@ namespace JSC {
         // will compress the displacement, and we may not be able to fit a repatched offset.
         static const int repatchGetByIdDefaultOffset = 256;
 
+#if USE(CTI_ARGUMENT)
+        static const int ctiArgumentInitSize = 4;
+#else
+        static const int ctiArgumentInitSize = 0;
+#endif
         // These architecture specific value are used to enable repatching - see comment on op_put_by_id.
         static const int repatchOffsetPutByIdStructureID = 19;
         static const int repatchOffsetPutByIdPropertyMapOffset = 34;
@@ -252,7 +257,7 @@ namespace JSC {
         static const int repatchOffsetGetByIdStructureID = 19;
         static const int repatchOffsetGetByIdBranchToSlowCase = 25;
         static const int repatchOffsetGetByIdPropertyMapOffset = 34;
-        static const int repatchOffsetGetByIdSlowCaseCall = 17;
+        static const int repatchOffsetGetByIdSlowCaseCall = 17 + ctiArgumentInitSize;
 
     public:
         static void compile(Machine* machine, ExecState* exec, CodeBlock* codeBlock)
index 26f6018..76f37b3 100644 (file)
@@ -1038,7 +1038,7 @@ public:
         return m_buffer->copy();
     }
 
-#if COMPILER(MSVC)
+#if USE(CTI_ARGUMENT)
     void emitConvertToFastCall()
     {
         movl_mr(4, X86::esp, X86::eax);
index d198c6b..75b6a2b 100644 (file)
 #endif
 #endif
 
+#if COMPILER(MSVC)
+#define WTF_USE_CTI_ARGUMENT 1
+#endif
+
 #endif /* WTF_Platform_h */