Modified: trunk/Source/_javascript_Core/ChangeLog (91677 => 91678)
--- trunk/Source/_javascript_Core/ChangeLog 2011-07-25 17:51:07 UTC (rev 91677)
+++ trunk/Source/_javascript_Core/ChangeLog 2011-07-25 17:59:08 UTC (rev 91678)
@@ -1,3 +1,22 @@
+2011-07-25 Filip Pizlo <[email protected]>
+
+ X86-64 assembler emits three instructions instead of two for certain
+ loads and stores.
+ https://bugs.webkit.org/show_bug.cgi?id=65095
+
+ Reviewed by Gavin Barraclough.
+
+ Simply made these four methods in the assembler use the scratch register,
+ which they were previously avoiding. It still optimizes for the case where
+ an absolute address memory accesses is using EAX. This results in a slight
+ performance improvement.
+
+ * assembler/MacroAssemblerX86_64.h:
+ (JSC::MacroAssemblerX86_64::load32):
+ (JSC::MacroAssemblerX86_64::store32):
+ (JSC::MacroAssemblerX86_64::loadPtr):
+ (JSC::MacroAssemblerX86_64::storePtr):
+
2011-07-25 Ryuan Choi <[email protected]>
[EFL] Implement EFL-specific current time and monotonicallyIncreasingTime.
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (91677 => 91678)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2011-07-25 17:51:07 UTC (rev 91677)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2011-07-25 17:59:08 UTC (rev 91678)
@@ -81,9 +81,8 @@
if (dest == X86Registers::eax)
m_assembler.movl_mEAX(address);
else {
- move(X86Registers::eax, dest);
- m_assembler.movl_mEAX(address);
- swap(X86Registers::eax, dest);
+ move(TrustedImmPtr(address), dest);
+ load32(dest, dest);
}
}
@@ -107,10 +106,8 @@
void store32(TrustedImm32 imm, void* address)
{
- move(X86Registers::eax, scratchRegister);
- move(imm, X86Registers::eax);
- m_assembler.movl_EAXm(address);
- move(scratchRegister, X86Registers::eax);
+ move(TrustedImmPtr(address), scratchRegister);
+ store32(imm, scratchRegister);
}
Call call()
@@ -257,9 +254,8 @@
if (dest == X86Registers::eax)
m_assembler.movq_mEAX(address);
else {
- move(X86Registers::eax, dest);
- m_assembler.movq_mEAX(address);
- swap(X86Registers::eax, dest);
+ move(TrustedImmPtr(address), dest);
+ loadPtr(dest, dest);
}
}
@@ -290,9 +286,8 @@
if (src == X86Registers::eax)
m_assembler.movq_EAXm(address);
else {
- swap(X86Registers::eax, src);
- m_assembler.movq_EAXm(address);
- swap(X86Registers::eax, src);
+ move(TrustedImmPtr(address), scratchRegister);
+ storePtr(src, scratchRegister);
}
}