Title: [99888] trunk/Source/_javascript_Core
Revision
99888
Author
[email protected]
Date
2011-11-10 12:24:06 -0800 (Thu, 10 Nov 2011)

Log Message

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):

Modified Paths

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
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to