[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.15.1-34-g43a6bb2

Gustavo Noronha Silva gustavo.noronha at collabora.co.uk
Wed Oct 7 06:26:19 UTC 2009


The following commit has been merged in the webkit-1.1 branch:
commit 012d5bfa425660278453faf8a0dc807ab3fef403
Author: eric at webkit.org <eric at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Sep 26 02:27:02 2009 +0000

    2009-09-25  Gabor Loki  <loki at inf.u-szeged.hu>
    
            Reviewed by Gavin Barraclough.
    
            Fix unaligned data access in YARR_JIT on ARMv5 and below.
            https://bugs.webkit.org/show_bug.cgi?id=29695
    
            On ARMv5 and below all data access should be naturally aligned.
            In the YARR_JIT there is a case when character pairs are
            loaded from the input string, but this data access is not
            naturally aligned. This fix introduces load32WithUnalignedHalfWords
            and branch32WithUnalignedHalfWords functions which contain
            naturally aligned memory loads - half word loads - on ARMv5 and below.
    
            * assembler/MacroAssemblerARM.cpp:
            (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords):
            * assembler/MacroAssemblerARM.h:
            (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords):
            (JSC::MacroAssemblerARM::branch32WithUnalignedHalfWords):
            * assembler/MacroAssemblerARMv7.h:
            (JSC::MacroAssemblerARMv7::load32WithUnalignedHalfWords):
            (JSC::MacroAssemblerARMv7::branch32):
            (JSC::MacroAssemblerARMv7::branch32WithUnalignedHalfWords):
            * assembler/MacroAssemblerX86Common.h:
            (JSC::MacroAssemblerX86Common::load32WithUnalignedHalfWords):
            (JSC::MacroAssemblerX86Common::branch32WithUnalignedHalfWords):
            * wtf/Platform.h:
            * yarr/RegexJIT.cpp:
            (JSC::Yarr::RegexGenerator::generatePatternCharacterPair):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@48782 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index 8eb6315..04378ef 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,126 +1,3 @@
-2009-09-28  Yaar Schnitman  <yaar at chromium.org>
-
-        Reviewed by Dimitri Glazkov.
-
-        Chromium port - recognize we are being built independently
-        of chromium and look for dependencies under webkit/chromium rather
-        than chromium/src.
-
-        https://bugs.webkit.org/show_bug.cgi?id=29722
-
-        * JavaScriptCore.gyp/JavaScriptCore.gyp:
-
-2009-09-28  Jakub Wieczorek  <faw217 at gmail.com>
-
-        Reviewed by Simon Hausmann.
-
-        [Qt] Implement XSLT support with QtXmlPatterns.
-        https://bugs.webkit.org/show_bug.cgi?id=28303
-
-        * wtf/Platform.h: Add a WTF_USE_QXMLQUERY #define.
-
-2009-09-28  Yongjun Zhang  <yongjun.zhang at nokia.com>
-
-        Reviewed by Eric Seidel.
-
-        https://bugs.webkit.org/show_bug.cgi?id=28054
-       
-        Use derefInNotNull() to work around winscw compiler forward declaration bug
-        regarding templated classes. 
-
-        The compiler bug is reported at 
-        https://xdabug001.ext.nokia.com/bugzilla/show_bug.cgi?id=9812.
-        
-        The change should be reverted when the above bug is fixed in winscw compiler. 
-
-        Add parenthesis around (RefPtr::*UnspecifiedBoolType) to make winscw compiler
-        work with the default UnSpecifiedBoolType() operator, which removes the winscw hack.
-
-        * wtf/RefPtr.h:
-        (WTF::RefPtr::~RefPtr):
-        (WTF::RefPtr::clear):
-        (WTF::RefPtr::operator UnspecifiedBoolType):
-
-2009-09-28  Gabor Loki  <loki at inf.u-szeged.hu>
-
-        Reviewed by Simon Hausmann.
-
-        Remove __clear_cache which is an internal function of GCC
-        https://bugs.webkit.org/show_bug.cgi?id=28886
-
-        Although __clear_cache is exported from GCC, this is an internal
-        function. GCC makes no promises about it.
-
-        * jit/ExecutableAllocator.h:
-        (JSC::ExecutableAllocator::cacheFlush):
-
-2009-09-28  Sam Weinig  <sam at webkit.org>
-
-        Reviewed by Oliver Hunt.
-
-        Fix an absolute path to somewhere in Oliver's machine to a relative path
-        for derived JSONObject.lut.h.
-
-        * JavaScriptCore.xcodeproj/project.pbxproj:
-
-2009-09-28  Joerg Bornemann  <joerg.bornemann at nokia.com>
-
-        Reviewed by Simon Hausmann.
-
-        Add ARM version detection for Windows CE.
-
-        * wtf/Platform.h:
-
-2009-09-26  Yongjun Zhang  <yongjun.zhang at nokia.com>
-
-        Reviewed by Simon Hausmann.
-
-        Add MarkStackSymbian.cpp to build JavascriptCore for Symbian.
-
-        Re-use Windows shrinkAllocation implementation because Symbian doesn't
-        support releasing part of memory region.
-        
-        Use fastMalloc and fastFree to implement allocateStack and releaseStack
-        for Symbian port.
-
-        * JavaScriptCore.pri:
-        * runtime/MarkStack.h:
-        (JSC::MarkStack::MarkStackArray::shrinkAllocation):
-        * runtime/MarkStackSymbian.cpp: Added.
-        (JSC::MarkStack::initializePagesize):
-        (JSC::MarkStack::allocateStack):
-        (JSC::MarkStack::releaseStack):
-
-2009-09-25  Gabor Loki  <loki at inf.u-szeged.hu>
-
-        Reviewed by Gavin Barraclough.
-
-        Fix unaligned data access in YARR_JIT on ARMv5 and below.
-        https://bugs.webkit.org/show_bug.cgi?id=29695
-
-        On ARMv5 and below all data access should be naturally aligned.
-        In the YARR_JIT there is a case when character pairs are
-        loaded from the input string, but this data access is not
-        naturally aligned. This fix introduces load32WithUnalignedHalfWords
-        and branch32WithUnalignedHalfWords functions which contain
-        naturally aligned memory loads - half word loads - on ARMv5 and below.
-
-        * assembler/MacroAssemblerARM.cpp:
-        (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords):
-        * assembler/MacroAssemblerARM.h:
-        (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords):
-        (JSC::MacroAssemblerARM::branch32WithUnalignedHalfWords):
-        * assembler/MacroAssemblerARMv7.h:
-        (JSC::MacroAssemblerARMv7::load32WithUnalignedHalfWords):
-        (JSC::MacroAssemblerARMv7::branch32):
-        (JSC::MacroAssemblerARMv7::branch32WithUnalignedHalfWords):
-        * assembler/MacroAssemblerX86Common.h:
-        (JSC::MacroAssemblerX86Common::load32WithUnalignedHalfWords):
-        (JSC::MacroAssemblerX86Common::branch32WithUnalignedHalfWords):
-        * wtf/Platform.h:
-        * yarr/RegexJIT.cpp:
-        (JSC::Yarr::RegexGenerator::generatePatternCharacterPair):
-
 2009-09-25  Jeremy Orlow  <jorlow at chromium.org>
 
         This is breaking Chromium try bots, so I'm counting this as a build fix.
diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.cpp b/JavaScriptCore/assembler/MacroAssemblerARM.cpp
index 43648c4..d726ecd 100644
--- a/JavaScriptCore/assembler/MacroAssemblerARM.cpp
+++ b/JavaScriptCore/assembler/MacroAssemblerARM.cpp
@@ -62,6 +62,33 @@ static bool isVFPPresent()
 
 const bool MacroAssemblerARM::s_isVFPPresent = isVFPPresent();
 
+#if defined(ARM_REQUIRE_NATURAL_ALIGNMENT) && ARM_REQUIRE_NATURAL_ALIGNMENT
+void MacroAssemblerARM::load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest)
+{
+    ARMWord op2;
+
+    ASSERT(address.scale >= 0 && address.scale <= 3);
+    op2 = m_assembler.lsl(address.index, static_cast<int>(address.scale));
+
+    if (address.offset >= 0 && address.offset + 0x2 <= 0xff) {
+        m_assembler.add_r(ARMRegisters::S0, address.base, op2);
+        m_assembler.ldrh_u(dest, ARMRegisters::S0, ARMAssembler::getOp2Byte(address.offset));
+        m_assembler.ldrh_u(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::getOp2Byte(address.offset + 0x2));
+    } else if (address.offset < 0 && address.offset >= -0xff) {
+        m_assembler.add_r(ARMRegisters::S0, address.base, op2);
+        m_assembler.ldrh_d(dest, ARMRegisters::S0, ARMAssembler::getOp2Byte(-address.offset));
+        m_assembler.ldrh_d(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::getOp2Byte(-address.offset - 0x2));
+    } else {
+        m_assembler.ldr_un_imm(ARMRegisters::S0, address.offset);
+        m_assembler.add_r(ARMRegisters::S0, ARMRegisters::S0, op2);
+        m_assembler.ldrh_r(dest, address.base, ARMRegisters::S0);
+        m_assembler.add_r(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::OP2_IMM | 0x2);
+        m_assembler.ldrh_r(ARMRegisters::S0, address.base, ARMRegisters::S0);
+    }
+    m_assembler.orr_r(dest, dest, m_assembler.lsl(ARMRegisters::S0, 16));
+}
+#endif
+
 }
 
 #endif // ENABLE(ASSEMBLER) && PLATFORM(ARM_TRADITIONAL)
diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.h b/JavaScriptCore/assembler/MacroAssemblerARM.h
index 0c696c9..aa8cbb0 100644
--- a/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -198,6 +198,15 @@ public:
         m_assembler.baseIndexTransfer32(true, dest, address.base, address.index, static_cast<int>(address.scale), address.offset);
     }
 
+#if defined(ARM_REQUIRE_NATURAL_ALIGNMENT) && ARM_REQUIRE_NATURAL_ALIGNMENT
+    void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest);
+#else
+    void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest)
+    {
+        load32(address, dest);
+    }
+#endif
+
     DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest)
     {
         DataLabel32 dataLabel(this);
@@ -364,6 +373,12 @@ public:
         return branch32(cond, ARMRegisters::S1, right);
     }
 
+    Jump branch32WithUnalignedHalfWords(Condition cond, BaseIndex left, Imm32 right)
+    {
+        load32WithUnalignedHalfWords(left, ARMRegisters::S1);
+        return branch32(cond, ARMRegisters::S1, right);
+    }
+
     Jump branch16(Condition cond, BaseIndex left, RegisterID right)
     {
         UNUSED_PARAM(cond);
diff --git a/JavaScriptCore/assembler/MacroAssemblerARMv7.h b/JavaScriptCore/assembler/MacroAssemblerARMv7.h
index 999056b..a549604 100644
--- a/JavaScriptCore/assembler/MacroAssemblerARMv7.h
+++ b/JavaScriptCore/assembler/MacroAssemblerARMv7.h
@@ -375,6 +375,11 @@ public:
         load32(setupArmAddress(address), dest);
     }
 
+    void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest)
+    {
+        load32(setupArmAddress(address), dest);
+    }
+
     void load32(void* address, RegisterID dest)
     {
         move(ImmPtr(address), addressTempRegister);
@@ -717,6 +722,13 @@ public:
         return branch32(cond, addressTempRegister, right);
     }
 
+    Jump branch32WithUnalignedHalfWords(Condition cond, BaseIndex left, Imm32 right)
+    {
+        // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/
+        load32WithUnalignedHalfWords(left, addressTempRegister);
+        return branch32(cond, addressTempRegister, right);
+    }
+
     Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right)
     {
         load32(left.m_ptr, dataTempRegister);
diff --git a/JavaScriptCore/assembler/MacroAssemblerX86Common.h b/JavaScriptCore/assembler/MacroAssemblerX86Common.h
index 61e0e17..5ebefa7 100644
--- a/JavaScriptCore/assembler/MacroAssemblerX86Common.h
+++ b/JavaScriptCore/assembler/MacroAssemblerX86Common.h
@@ -306,6 +306,11 @@ public:
         m_assembler.movl_mr(address.offset, address.base, address.index, address.scale, dest);
     }
 
+    void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest)
+    {
+        load32(address, dest);
+    }
+
     DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest)
     {
         m_assembler.movl_mr_disp32(address.offset, address.base, dest);
@@ -604,6 +609,11 @@ public:
         return Jump(m_assembler.jCC(x86Condition(cond)));
     }
 
+    Jump branch32WithUnalignedHalfWords(Condition cond, BaseIndex left, Imm32 right)
+    {
+        return branch32(cond, left, right);
+    }
+
     Jump branch16(Condition cond, BaseIndex left, RegisterID right)
     {
         m_assembler.cmpw_rm(right, left.offset, left.base, left.index, left.scale);
diff --git a/JavaScriptCore/wtf/Platform.h b/JavaScriptCore/wtf/Platform.h
index 2894d43..09dde24 100644
--- a/JavaScriptCore/wtf/Platform.h
+++ b/JavaScriptCore/wtf/Platform.h
@@ -257,6 +257,10 @@
 #undef ARM_ARCH_VERSION
 #define ARM_ARCH_VERSION 7
 #endif
+/* On ARMv5 and below the natural alignment is required. */
+#if !defined(ARM_REQUIRE_NATURAL_ALIGNMENT) && ARM_ARCH_VERSION <= 5
+#define ARM_REQUIRE_NATURAL_ALIGNMENT 1
+#endif
 /* Defines two pseudo-platforms for ARM and Thumb-2 instruction set. */
 #if !defined(WTF_PLATFORM_ARM_TRADITIONAL) && !defined(WTF_PLATFORM_ARM_THUMB2)
 #  if defined(thumb2) || defined(__thumb2__)
diff --git a/JavaScriptCore/yarr/RegexJIT.cpp b/JavaScriptCore/yarr/RegexJIT.cpp
index 4390b5b..d777424 100644
--- a/JavaScriptCore/yarr/RegexJIT.cpp
+++ b/JavaScriptCore/yarr/RegexJIT.cpp
@@ -549,11 +549,11 @@ class RegexGenerator : private MacroAssembler {
         }
 
         if (mask) {
-            load32(BaseIndex(input, index, TimesTwo, state.inputOffset() * sizeof(UChar)), character);
+            load32WithUnalignedHalfWords(BaseIndex(input, index, TimesTwo, state.inputOffset() * sizeof(UChar)), character);
             or32(Imm32(mask), character);
             state.jumpToBacktrack(branch32(NotEqual, character, Imm32(chPair | mask)), this);
         } else
-            state.jumpToBacktrack(branch32(NotEqual, BaseIndex(input, index, TimesTwo, state.inputOffset() * sizeof(UChar)), Imm32(chPair)), this);
+            state.jumpToBacktrack(branch32WithUnalignedHalfWords(NotEqual, BaseIndex(input, index, TimesTwo, state.inputOffset() * sizeof(UChar)), Imm32(chPair)), this);
     }
 
     void generatePatternCharacterFixed(TermGenerationState& state)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list