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.