Title: [159871] trunk/Source/_javascript_Core
Revision
159871
Author
[email protected]
Date
2013-11-29 06:16:18 -0800 (Fri, 29 Nov 2013)

Log Message

Merge arm and sh4 paths in nativeForGenerator and privateCompileCTINativeCall functions.
https://bugs.webkit.org/show_bug.cgi?id=124892

Patch by Julien Brianceau <[email protected]> on 2013-11-29
Reviewed by Zoltan Herczeg.

* assembler/MacroAssemblerSH4.h:
(JSC::MacroAssemblerSH4::call): Pick a scratch register instead of getting it as a
parameter. The sh4 port was the only one to have this call(Address, RegisterID) prototype.
* jit/JITOpcodes32_64.cpp:
(JSC::JIT::privateCompileCTINativeCall): Use argumentGPRx and merge arm and sh4 paths.
* jit/ThunkGenerators.cpp:
(JSC::nativeForGenerator): Use argumentGPRx and merge arm and sh4 paths.

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (159870 => 159871)


--- trunk/Source/_javascript_Core/ChangeLog	2013-11-29 12:23:14 UTC (rev 159870)
+++ trunk/Source/_javascript_Core/ChangeLog	2013-11-29 14:16:18 UTC (rev 159871)
@@ -1,3 +1,18 @@
+2013-11-29  Julien Brianceau  <[email protected]>
+
+        Merge arm and sh4 paths in nativeForGenerator and privateCompileCTINativeCall functions.
+        https://bugs.webkit.org/show_bug.cgi?id=124892
+
+        Reviewed by Zoltan Herczeg.
+
+        * assembler/MacroAssemblerSH4.h:
+        (JSC::MacroAssemblerSH4::call): Pick a scratch register instead of getting it as a
+        parameter. The sh4 port was the only one to have this call(Address, RegisterID) prototype.
+        * jit/JITOpcodes32_64.cpp:
+        (JSC::JIT::privateCompileCTINativeCall): Use argumentGPRx and merge arm and sh4 paths.
+        * jit/ThunkGenerators.cpp:
+        (JSC::nativeForGenerator): Use argumentGPRx and merge arm and sh4 paths.
+
 2013-11-28  Nadav Rotem  <[email protected]>
 
         Revert the X86 assembler peephole changes

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h (159870 => 159871)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h	2013-11-29 12:23:14 UTC (rev 159870)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h	2013-11-29 14:16:18 UTC (rev 159871)
@@ -2360,12 +2360,14 @@
         return Call(m_assembler.call(target), Call::None);
     }
 
-    void call(Address address, RegisterID target)
+    void call(Address address)
     {
+        RegisterID target = claimScratch();
         load32(address.base, address.offset, target);
         m_assembler.ensureSpace(m_assembler.maxInstructionSize + 2);
         m_assembler.branch(JSR_OPCODE, target);
         m_assembler.nop();
+        releaseScratch(target);
     }
 
     void breakpoint()

Modified: trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp (159870 => 159871)


--- trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp	2013-11-29 12:23:14 UTC (rev 159870)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp	2013-11-29 14:16:18 UTC (rev 159871)
@@ -74,9 +74,8 @@
 
     addPtr(TrustedImm32(16 - sizeof(void*)), stackPointerRegister);
 
-#elif CPU(ARM)
-    // Load caller frame's scope chain into this callframe so that whatever we call can
-    // get to its global data.
+#elif CPU(ARM) || CPU(SH4)
+    // Load caller frame's scope chain into this callframe so that whatever we call can get to its global data.
     emitGetCallerFrameFromCallFrameHeaderPtr(regT2);
     emitGetFromCallFrameHeaderPtr(JSStack::ScopeChain, regT1, regT2);
     emitPutCellToCallFrameHeader(regT1, JSStack::ScopeChain);
@@ -84,19 +83,18 @@
     preserveReturnAddressAfterCall(regT3); // Callee preserved
     emitPutReturnPCToCallFrameHeader(regT3);
 
-    // Calling convention:      f(r0 == regT0, r1 == regT1, ...);
-    // Host function signature: f(ExecState*);
-    move(callFrameRegister, ARMRegisters::r0);
+    // Calling convention is f(argumentGPR0, argumentGPR1, ...).
+    // Host function signature is f(ExecState*).
+    move(callFrameRegister, argumentGPR0);
 
-    emitGetFromCallFrameHeaderPtr(JSStack::Callee, ARMRegisters::r1);
+    emitGetFromCallFrameHeaderPtr(JSStack::Callee, argumentGPR1);
     move(regT2, callFrameRegister); // Eagerly restore caller frame register to avoid loading from stack.
-    loadPtr(Address(ARMRegisters::r1, OBJECT_OFFSETOF(JSFunction, m_executable)), regT2);
+    loadPtr(Address(argumentGPR1, OBJECT_OFFSETOF(JSFunction, m_executable)), regT2);
 
     // call the function
     nativeCall = call();
 
     restoreReturnAddressBeforeReturn(regT3);
-
 #elif CPU(MIPS)
     // Load caller frame's scope chain into this callframe so that whatever we call can
     // get to its global data.
@@ -129,28 +127,6 @@
     addPtr(TrustedImm32(16), stackPointerRegister);
 
     restoreReturnAddressBeforeReturn(regT3);
-#elif CPU(SH4)
-    // Load caller frame's scope chain into this callframe so that whatever we call can
-    // get to its global data.
-    emitGetCallerFrameFromCallFrameHeaderPtr(regT2);
-    emitGetFromCallFrameHeaderPtr(JSStack::ScopeChain, regT1, regT2);
-    emitPutCellToCallFrameHeader(regT1, JSStack::ScopeChain);
-
-    preserveReturnAddressAfterCall(regT3); // Callee preserved
-    emitPutReturnPCToCallFrameHeader(regT3);
-
-    // Calling convention: f(r0 == regT4, r1 == regT5, ...);
-    // Host function signature: f(ExecState*);
-    move(callFrameRegister, regT4);
-
-    emitGetFromCallFrameHeaderPtr(JSStack::Callee, regT5);
-    move(regT2, callFrameRegister); // Eagerly restore caller frame register to avoid loading from stack.
-    loadPtr(Address(regT5, OBJECT_OFFSETOF(JSFunction, m_executable)), regT2);
-
-    // call the function
-    nativeCall = call();
-
-    restoreReturnAddressBeforeReturn(regT3);
 #else
 #error "JIT not supported on this platform."
     breakpoint();

Modified: trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp (159870 => 159871)


--- trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp	2013-11-29 12:23:14 UTC (rev 159870)
+++ trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp	2013-11-29 14:16:18 UTC (rev 159871)
@@ -343,9 +343,8 @@
 
     jit.restoreReturnAddressBeforeReturn(JSInterfaceJIT::regT3);
 
-#elif CPU(ARM)
-    // Load caller frame's scope chain into this callframe so that whatever we call can
-    // get to its global data.
+#elif CPU(ARM) || CPU(SH4)
+    // Load caller frame's scope chain into this callframe so that whatever we call can get to its global data.
     jit.emitGetCallerFrameFromCallFrameHeaderPtr(JSInterfaceJIT::regT2);
     jit.emitGetFromCallFrameHeaderPtr(JSStack::ScopeChain, JSInterfaceJIT::regT1, JSInterfaceJIT::regT2);
     jit.emitPutCellToCallFrameHeader(JSInterfaceJIT::regT1, JSStack::ScopeChain);
@@ -353,38 +352,16 @@
     jit.preserveReturnAddressAfterCall(JSInterfaceJIT::regT3); // Callee preserved
     jit.emitPutReturnPCToCallFrameHeader(JSInterfaceJIT::regT3);
 
-    // Calling convention:      f(r0 == regT0, r1 == regT1, ...);
-    // Host function signature: f(ExecState*);
-    jit.move(JSInterfaceJIT::callFrameRegister, ARMRegisters::r0);
+    // Calling convention is f(argumentGPR0, argumentGPR1, ...).
+    // Host function signature is f(ExecState*).
+    jit.move(JSInterfaceJIT::callFrameRegister, JSInterfaceJIT::argumentGPR0);
 
-    jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, ARMRegisters::r1);
+    jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, JSInterfaceJIT::argumentGPR1);
     jit.move(JSInterfaceJIT::regT2, JSInterfaceJIT::callFrameRegister); // Eagerly restore caller frame register to avoid loading from stack.
-    jit.loadPtr(JSInterfaceJIT::Address(ARMRegisters::r1, JSFunction::offsetOfExecutable()), JSInterfaceJIT::regT2);
+    jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::argumentGPR1, JSFunction::offsetOfExecutable()), JSInterfaceJIT::regT2);
     jit.call(JSInterfaceJIT::Address(JSInterfaceJIT::regT2, executableOffsetToFunction));
 
     jit.restoreReturnAddressBeforeReturn(JSInterfaceJIT::regT3);
-
-#elif CPU(SH4)
-    // Load caller frame's scope chain into this callframe so that whatever we call can
-    // get to its global data.
-    jit.emitGetCallerFrameFromCallFrameHeaderPtr(JSInterfaceJIT::regT2);
-    jit.emitGetFromCallFrameHeaderPtr(JSStack::ScopeChain, JSInterfaceJIT::regT1, JSInterfaceJIT::regT2);
-    jit.emitPutCellToCallFrameHeader(JSInterfaceJIT::regT1, JSStack::ScopeChain);
-
-    jit.preserveReturnAddressAfterCall(JSInterfaceJIT::regT3); // Callee preserved
-    jit.emitPutReturnPCToCallFrameHeader(JSInterfaceJIT::regT3);
-
-    // Calling convention: f(r0 == regT4, r1 == regT5, ...);
-    // Host function signature: f(ExecState*);
-    jit.move(JSInterfaceJIT::callFrameRegister, JSInterfaceJIT::regT4);
-
-    jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, JSInterfaceJIT::regT5);
-    jit.move(JSInterfaceJIT::regT2, JSInterfaceJIT::callFrameRegister); // Eagerly restore caller frame register to avoid loading from stack.
-    jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::regT5, JSFunction::offsetOfExecutable()), JSInterfaceJIT::regT2);
-
-    jit.call(JSInterfaceJIT::Address(JSInterfaceJIT::regT2, executableOffsetToFunction), JSInterfaceJIT::regT0);
-    jit.restoreReturnAddressBeforeReturn(JSInterfaceJIT::regT3);
-
 #elif CPU(MIPS)
     // Load caller frame's scope chain into this callframe so that whatever we call can
     // get to its global data.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to