Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (99887 => 99888)
--- trunk/Source/_javascript_Core/ChangeLog 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/ChangeLog 2011-11-10 20:24:06 UTC (rev 99888)
@@ -1,5 +1,32 @@
-2011-11-10 Ryuan Choi <[email protected]>
+2011-11-10 Gavin Barraclough <[email protected]>
+ Fix sampling counters on ARMv7, move add64 functionality to macro assembler
+ https://bugs.webkit.org/show_bug.cgi?id=72040
+
+ Reviewed by Geoff Garen.
+
+ The ability to add an integer to a uint64_t in memory is poorly copied in
+ multiple places & ifdef'ed on architecture, addWithCarry32 is also a badly
+ designed interface since add32 is not required to set flags (we have no
+ concept of flags in the macro assembler interface).
+
+ * assembler/MacroAssemblerARMv7.h:
+ (JSC::MacroAssemblerARMv7::add64):
+ * assembler/MacroAssemblerX86.h:
+ (JSC::MacroAssemblerX86::add64):
+ * assembler/MacroAssemblerX86_64.h:
+ (JSC::MacroAssemblerX86_64::add64):
+ * dfg/DFGAssemblyHelpers.cpp:
+ * dfg/DFGAssemblyHelpers.h:
+ (JSC::DFG::AssemblyHelpers::emitCount):
+ * dfg/DFGJITCodeGenerator.cpp:
+ (JSC::DFG::JITCodeGenerator::writeBarrier):
+ * jit/JIT.h:
+ * jit/JITInlineMethods.h:
+ (JSC::JIT::emitCount):
+
+011-11-10 Ryuan Choi <[email protected]>
+
[CMAKE] Refactoring CMakeLists${PORT}.txt to Platform${PORT}.cmake
https://bugs.webkit.org/show_bug.cgi?id=56705
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (99887 => 99888)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2011-11-10 20:24:06 UTC (rev 99888)
@@ -211,6 +211,26 @@
store32(dataTempRegister, address.m_ptr);
}
+ void add64(TrustedImm32 imm, AbsoluteAddress address)
+ {
+ move(TrustedImmPtr(address.m_ptr), addressTempRegister);
+
+ m_assembler.ldr(dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt12(0));
+ ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value);
+ if (armImm.isValid())
+ m_assembler.add_S(dataTempRegister, dataTempRegister, armImm);
+ else {
+ move(imm, addressTempRegister);
+ m_assembler.add_S(dataTempRegister, dataTempRegister, addressTempRegister);
+ move(TrustedImmPtr(address.m_ptr), addressTempRegister);
+ }
+ m_assembler.str(dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt12(0));
+
+ m_assembler.ldr(dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt12(4));
+ m_assembler.adc(dataTempRegister, dataTempRegister, ARMThumbImmediate::makeEncodedImm(imm.m_value >> 31));
+ m_assembler.str(dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt12(4));
+ }
+
void and32(RegisterID op1, RegisterID op2, RegisterID dest)
{
m_assembler.ARM_and(dest, op1, op2);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h (99887 => 99888)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h 2011-11-10 20:24:06 UTC (rev 99888)
@@ -62,11 +62,12 @@
m_assembler.addl_im(imm.m_value, address.m_ptr);
}
- void addWithCarry32(TrustedImm32 imm, AbsoluteAddress address)
+ void add64(TrustedImm32 imm, AbsoluteAddress address)
{
- m_assembler.adcl_im(imm.m_value, address.m_ptr);
+ m_assembler.addl_im(imm.m_value, address.m_ptr);
+ m_assembler.adcl_im(imm.m_value >> 31, reinterpret_cast<const char*>(address.m_ptr) + sizeof(int32_t));
}
-
+
void and32(TrustedImm32 imm, AbsoluteAddress address)
{
m_assembler.andl_im(imm.m_value, address.m_ptr);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (99887 => 99888)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2011-11-10 20:24:06 UTC (rev 99888)
@@ -184,7 +184,12 @@
move(TrustedImmPtr(address.m_ptr), scratchRegister);
addPtr(imm, Address(scratchRegister));
}
-
+
+ void add64(TrustedImm32 imm, AbsoluteAddress address)
+ {
+ addPtr(imm, address);
+ }
+
void andPtr(RegisterID src, RegisterID dest)
{
m_assembler.andq_rr(src, dest);
Modified: trunk/Source/_javascript_Core/dfg/DFGAssemblyHelpers.cpp (99887 => 99888)
--- trunk/Source/_javascript_Core/dfg/DFGAssemblyHelpers.cpp 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/dfg/DFGAssemblyHelpers.cpp 2011-11-10 20:24:06 UTC (rev 99888)
@@ -44,22 +44,6 @@
return result.first->second;
}
-#if ENABLE(SAMPLING_COUNTERS) && CPU(X86_64) // Or any other 64-bit platform!
-void AssemblyHelpers::emitCount(MacroAssembler& jit, AbstractSamplingCounter& counter, uint32_t increment)
-{
- jit.addPtr(TrustedImm32(increment), AbsoluteAddress(counter.addressOfCounter()));
-}
-#endif
-
-#if ENABLE(SAMPLING_COUNTERS) && CPU(X86) // Or any other little-endian 32-bit platform!
-void AssemblyHelpers::emitCount(MacroAsembler& jit, AbstractSamplingCounter& counter, uint32_t increment)
-{
- intptr_t hiWord = reinterpret_cast<intptr_t>(counter.addressOfCounter()) + sizeof(int32_t);
- jit.add32(TrustedImm32(increment), AbsoluteAddress(counter.addressOfCounter()));
- jit.addWithCarry32(TrustedImm32(0), AbsoluteAddress(reinterpret_cast<void*>(hiWord)));
-}
-#endif
-
#if ENABLE(SAMPLING_FLAGS)
void AssemblyHelpers::setSamplingFlag(int32_t flag)
{
Modified: trunk/Source/_javascript_Core/dfg/DFGAssemblyHelpers.h (99887 => 99888)
--- trunk/Source/_javascript_Core/dfg/DFGAssemblyHelpers.h 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/dfg/DFGAssemblyHelpers.h 2011-11-10 20:24:06 UTC (rev 99888)
@@ -214,12 +214,14 @@
#endif
#if ENABLE(SAMPLING_COUNTERS)
- // Debug profiling tool.
- static void emitCount(MacroAssembler&, AbstractSamplingCounter&, uint32_t increment = 1);
- void emitCount(AbstractSamplingCounter& counter, uint32_t increment = 1)
+ static void emitCount(MacroAssembler& jit, AbstractSamplingCounter& counter, int32_t increment = 1)
{
- emitCount(*this, counter, increment);
+ jit.add64(TrustedImm32(increment), AbsoluteAddress(counter.addressOfCounter()));
}
+ void emitCount(AbstractSamplingCounter& counter, int32_t increment = 1)
+ {
+ add64(TrustedImm32(increment), AbsoluteAddress(counter.addressOfCounter()));
+ }
#endif
#if ENABLE(SAMPLING_FLAGS)
Modified: trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.cpp (99887 => 99888)
--- trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.cpp 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.cpp 2011-11-10 20:24:06 UTC (rev 99888)
@@ -243,7 +243,7 @@
return;
#if ENABLE(WRITE_BARRIER_PROFILING)
- JITCompiler::emitCount(jit, WriteBarrierCounters::jitCounterFor(useKind));
+ JITCompiler::emitCount(m_jit, WriteBarrierCounters::jitCounterFor(useKind));
#endif
#if ENABLE(GGC)
@@ -286,7 +286,7 @@
return;
#if ENABLE(WRITE_BARRIER_PROFILING)
- JITCompiler::emitCount(jit, WriteBarrierCounters::jitCounterFor(useKind));
+ JITCompiler::emitCount(m_jit, WriteBarrierCounters::jitCounterFor(useKind));
#endif
#if ENABLE(GGC)
@@ -318,7 +318,7 @@
return;
#if ENABLE(WRITE_BARRIER_PROFILING)
- JITCompiler::emitCount(jit, WriteBarrierCounters::jitCounterFor(useKind));
+ JITCompiler::emitCount(m_jit, WriteBarrierCounters::jitCounterFor(useKind));
#endif
#if ENABLE(GGC)
Modified: trunk/Source/_javascript_Core/jit/JIT.h (99887 => 99888)
--- trunk/Source/_javascript_Core/jit/JIT.h 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/jit/JIT.h 2011-11-10 20:24:06 UTC (rev 99888)
@@ -1021,7 +1021,7 @@
#endif
#if ENABLE(SAMPLING_COUNTERS)
- void emitCount(AbstractSamplingCounter&, uint32_t = 1);
+ void emitCount(AbstractSamplingCounter&, int32_t = 1);
#endif
#if ENABLE(OPCODE_SAMPLING)
Modified: trunk/Source/_javascript_Core/jit/JITInlineMethods.h (99887 => 99888)
--- trunk/Source/_javascript_Core/jit/JITInlineMethods.h 2011-11-10 20:04:06 UTC (rev 99887)
+++ trunk/Source/_javascript_Core/jit/JITInlineMethods.h 2011-11-10 20:24:06 UTC (rev 99888)
@@ -358,17 +358,9 @@
#endif
#if ENABLE(SAMPLING_COUNTERS)
-ALWAYS_INLINE void JIT::emitCount(AbstractSamplingCounter& counter, uint32_t count)
+ALWAYS_INLINE void JIT::emitCount(AbstractSamplingCounter& counter, int32_t count)
{
-#if CPU(X86_64) // Or any other 64-bit plattform.
- addPtr(TrustedImm32(count), AbsoluteAddress(counter.addressOfCounter()));
-#elif CPU(X86) // Or any other little-endian 32-bit plattform.
- intptr_t hiWord = reinterpret_cast<intptr_t>(counter.addressOfCounter()) + sizeof(int32_t);
- add32(TrustedImm32(count), AbsoluteAddress(counter.addressOfCounter()));
- addWithCarry32(TrustedImm32(0), AbsoluteAddress(reinterpret_cast<void*>(hiWord)));
-#else
-#error "SAMPLING_FLAGS not implemented on this platform."
-#endif
+ add64(TrustedImm32(count), AbsoluteAddress(counter.addressOfCounter()));
}
#endif