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