Title: [170548] trunk/Source/WebCore
Revision
170548
Author
[email protected]
Date
2014-06-27 13:31:31 -0700 (Fri, 27 Jun 2014)

Log Message

Prevent unnecessary register saving in css jit.
https://bugs.webkit.org/show_bug.cgi?id=133955

Reviewed by Geoff Garen.

* cssjit/FunctionCall.h:
(WebCore::FunctionCall::prepareAndCall):
(WebCore::FunctionCall::cleanupPostCall):
(WebCore::FunctionCall::saveAllocatedCallerSavedRegisters):
(WebCore::FunctionCall::restoreAllocatedCallerSavedRegisters):
(WebCore::FunctionCall::saveAllocatedRegisters): Renamed to saveAllocatedCallerSavedRegisters.
(WebCore::FunctionCall::restoreAllocatedRegisters): Renamed to restoreAllocatedCallerSavedRegisters.
Only push caller saved registers before function calls.
* cssjit/RegisterAllocator.h:
(WebCore::RegisterAllocator::isValidRegister):
Corrected register ranges.
(WebCore::RegisterAllocator::isCallerSavedRegister): Added.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (170547 => 170548)


--- trunk/Source/WebCore/ChangeLog	2014-06-27 19:54:49 UTC (rev 170547)
+++ trunk/Source/WebCore/ChangeLog	2014-06-27 20:31:31 UTC (rev 170548)
@@ -1,3 +1,23 @@
+2014-06-27  Alex Christensen  <[email protected]>
+
+        Prevent unnecessary register saving in css jit.
+        https://bugs.webkit.org/show_bug.cgi?id=133955
+
+        Reviewed by Geoff Garen.
+
+        * cssjit/FunctionCall.h:
+        (WebCore::FunctionCall::prepareAndCall):
+        (WebCore::FunctionCall::cleanupPostCall):
+        (WebCore::FunctionCall::saveAllocatedCallerSavedRegisters):
+        (WebCore::FunctionCall::restoreAllocatedCallerSavedRegisters):
+        (WebCore::FunctionCall::saveAllocatedRegisters): Renamed to saveAllocatedCallerSavedRegisters.
+        (WebCore::FunctionCall::restoreAllocatedRegisters): Renamed to restoreAllocatedCallerSavedRegisters.
+        Only push caller saved registers before function calls.
+        * cssjit/RegisterAllocator.h:
+        (WebCore::RegisterAllocator::isValidRegister):
+        Corrected register ranges.
+        (WebCore::RegisterAllocator::isCallerSavedRegister): Added.
+
 2014-06-27  Beth Dakin  <[email protected]>
 
         Custom scrollbars should not create ScrollbarPainters on Mac

Modified: trunk/Source/WebCore/cssjit/FunctionCall.h (170547 => 170548)


--- trunk/Source/WebCore/cssjit/FunctionCall.h	2014-06-27 19:54:49 UTC (rev 170547)
+++ trunk/Source/WebCore/cssjit/FunctionCall.h	2014-06-27 20:31:31 UTC (rev 170548)
@@ -113,7 +113,7 @@
         ASSERT(m_functionAddress.executableAddress());
         ASSERT(!m_firstArgument || (m_firstArgument && !m_secondArgument) || (m_firstArgument && m_secondArgument));
 
-        saveAllocatedRegisters();
+        saveAllocatedCallerSavedRegisters();
         m_stackAllocator.alignStackPreFunctionCall();
 
         if (m_argumentCount == 2) {
@@ -155,20 +155,25 @@
     void cleanupPostCall()
     {
         m_stackAllocator.unalignStackPostFunctionCall();
-        restoreAllocatedRegisters();
+        restoreAllocatedCallerSavedRegisters();
     }
 
-    void saveAllocatedRegisters()
+    void saveAllocatedCallerSavedRegisters()
     {
         ASSERT(m_savedRegisterStackReferences.isEmpty());
+        ASSERT(m_savedRegisters.isEmpty());
         const Vector<JSC::MacroAssembler::RegisterID, registerCount>& allocatedRegisters = m_registerAllocator.allocatedRegisters();
-        Vector<StackAllocator::StackReference> stackReferences = m_stackAllocator.push(allocatedRegisters);
+        for (auto registerID : allocatedRegisters) {
+            if (RegisterAllocator::isCallerSavedRegister(registerID))
+                m_savedRegisters.append(registerID);
+        }
+        Vector<StackAllocator::StackReference> stackReferences = m_stackAllocator.push(m_savedRegisters);
         m_savedRegisterStackReferences.appendVector(stackReferences);
     }
 
-    void restoreAllocatedRegisters()
+    void restoreAllocatedCallerSavedRegisters()
     {
-        m_stackAllocator.pop(m_savedRegisterStackReferences, m_registerAllocator.allocatedRegisters());
+        m_stackAllocator.pop(m_savedRegisterStackReferences, m_savedRegisters);
         m_savedRegisterStackReferences.clear();
     }
 
@@ -177,8 +182,9 @@
     StackAllocator& m_stackAllocator;
     Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr>>& m_callRegistry;
 
-    Vector<StackAllocator::StackReference> m_savedRegisterStackReferences;
-
+    Vector<JSC::MacroAssembler::RegisterID, registerCount> m_savedRegisters;
+    Vector<StackAllocator::StackReference, registerCount> m_savedRegisterStackReferences;
+    
     JSC::FunctionPtr m_functionAddress;
     unsigned m_argumentCount;
     JSC::MacroAssembler::RegisterID m_firstArgument;

Modified: trunk/Source/WebCore/cssjit/RegisterAllocator.h (170547 => 170548)


--- trunk/Source/WebCore/cssjit/RegisterAllocator.h	2014-06-27 19:54:49 UTC (rev 170547)
+++ trunk/Source/WebCore/cssjit/RegisterAllocator.h	2014-06-27 20:31:31 UTC (rev 170548)
@@ -172,15 +172,32 @@
     static bool isValidRegister(JSC::MacroAssembler::RegisterID registerID)
     {
 #if CPU(ARM64)
-        return registerID >= JSC::ARM64Registers::x0 && registerID <= JSC::ARM64Registers::x15;
+        return (registerID >= JSC::ARM64Registers::x0 && registerID <= JSC::ARM64Registers::x14)
+            || registerID == JSC::ARM64Registers::x19;
 #elif CPU(ARM_THUMB2)
         return registerID >= JSC::ARMRegisters::r0 && registerID <= JSC::ARMRegisters::r7 && registerID != JSC::ARMRegisters::r6;
 #elif CPU(X86_64)
-        return registerID >= JSC::X86Registers::eax && registerID <= JSC::X86Registers::r14;
+        return (registerID >= JSC::X86Registers::eax && registerID <= JSC::X86Registers::edx)
+            || (registerID >= JSC::X86Registers::esi && registerID <= JSC::X86Registers::r15);
 #else
 #error RegisterAllocator does not define the valid register range for the current architecture.
 #endif
     }
+    
+    static bool isCallerSavedRegister(JSC::MacroAssembler::RegisterID registerID)
+    {
+        ASSERT(isValidRegister(registerID));
+#if CPU(ARM64)
+        return registerID >= JSC::ARM64Registers::x0 && registerID <= JSC::ARM64Registers::x14;
+#elif CPU(ARM_THUMB2)
+        return registerID >= JSC::ARMRegisters::r0 && registerID <= JSC::ARMRegisters::r3;
+#elif CPU(X86_64)
+        return (registerID >= JSC::X86Registers::eax && registerID <= JSC::X86Registers::edx)
+            || (registerID >= JSC::X86Registers::esi && registerID <= JSC::X86Registers::r11);
+#else
+#error RegisterAllocator does not define the valid caller saved register range for the current architecture.
+#endif
+    }
 
 private:
     Deque<JSC::MacroAssembler::RegisterID> m_registers;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to