Title: [96169] trunk/Source/_javascript_Core
Revision
96169
Author
barraclo...@apple.com
Date
2011-09-27 16:32:23 -0700 (Tue, 27 Sep 2011)

Log Message

Macro assembler branch8 & 16 methods vary in treatment of upper bits
https://bugs.webkit.org/show_bug.cgi?id=68301

Reviewed by Sam Weinig.

Fix for branch16 - remove it!
No performance impact.

* assembler/MacroAssembler.h:
* assembler/MacroAssemblerARM.h:
* assembler/MacroAssemblerARMv7.h:
* assembler/MacroAssemblerMIPS.h:
* assembler/MacroAssemblerSH4.h:
* assembler/MacroAssemblerX86Common.h:
* yarr/YarrJIT.cpp:
(JSC::Yarr::YarrGenerator::jumpIfCharNotEquals):
(JSC::Yarr::YarrGenerator::generatePatternCharacterOnce):
(JSC::Yarr::YarrGenerator::generatePatternCharacterFixed):
(JSC::Yarr::YarrGenerator::generatePatternCharacterGreedy):
(JSC::Yarr::YarrGenerator::backtrackPatternCharacterNonGreedy):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (96168 => 96169)


--- trunk/Source/_javascript_Core/ChangeLog	2011-09-27 23:24:53 UTC (rev 96168)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-09-27 23:32:23 UTC (rev 96169)
@@ -1,3 +1,26 @@
+2011-09-24  Gavin Barraclough  <barraclo...@apple.com>
+
+        Macro assembler branch8 & 16 methods vary in treatment of upper bits
+        https://bugs.webkit.org/show_bug.cgi?id=68301
+
+        Reviewed by Sam Weinig.
+
+        Fix for branch16 - remove it!
+        No performance impact.
+
+        * assembler/MacroAssembler.h:
+        * assembler/MacroAssemblerARM.h:
+        * assembler/MacroAssemblerARMv7.h:
+        * assembler/MacroAssemblerMIPS.h:
+        * assembler/MacroAssemblerSH4.h:
+        * assembler/MacroAssemblerX86Common.h:
+        * yarr/YarrJIT.cpp:
+        (JSC::Yarr::YarrGenerator::jumpIfCharNotEquals):
+        (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce):
+        (JSC::Yarr::YarrGenerator::generatePatternCharacterFixed):
+        (JSC::Yarr::YarrGenerator::generatePatternCharacterGreedy):
+        (JSC::Yarr::YarrGenerator::backtrackPatternCharacterNonGreedy):
+
 2011-09-27  Mark Hahnenberg  <mhahnenb...@apple.com>
 
         Add static version of JSCell::getCallData

Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (96168 => 96169)


--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h	2011-09-27 23:24:53 UTC (rev 96168)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h	2011-09-27 23:32:23 UTC (rev 96169)
@@ -69,7 +69,6 @@
     using MacroAssemblerBase::pop;
     using MacroAssemblerBase::jump;
     using MacroAssemblerBase::branch32;
-    using MacroAssemblerBase::branch16;
 #if CPU(X86_64)
     using MacroAssemblerBase::branchPtr;
     using MacroAssemblerBase::branchTestPtr;
@@ -130,11 +129,6 @@
         return branch32(commute(cond), right, left);
     }
 
-    void branch16(RelationalCondition cond, BaseIndex left, RegisterID right, Label target)
-    {
-        branch16(cond, left, right).linkTo(target, this);
-    }
-    
     void branchTestPtr(ResultCondition cond, RegisterID reg, Label target)
     {
         branchTestPtr(cond, reg).linkTo(target, this);

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h (96168 => 96169)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h	2011-09-27 23:24:53 UTC (rev 96168)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h	2011-09-27 23:32:23 UTC (rev 96169)
@@ -426,15 +426,6 @@
         return branch32(cond, ARMRegisters::S1, right);
     }
 
-    Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right)
-    {
-        ASSERT(!(right.m_value & 0xFFFF0000));
-        right.m_value <<= 16;
-        m_assembler.mov_r(ARMRegisters::S1, left);
-        lshift32(TrustedImm32(16), ARMRegisters::S1);
-        return branch32(cond, ARMRegisters::S1, right);
-    }
-
     Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right, int useConstantPool = 0)
     {
         m_assembler.cmp_r(left, right);
@@ -486,23 +477,6 @@
         return branch32(cond, ARMRegisters::S1, right);
     }
 
-    Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right)
-    {
-        UNUSED_PARAM(cond);
-        UNUSED_PARAM(left);
-        UNUSED_PARAM(right);
-        ASSERT_NOT_REACHED();
-        return jump();
-    }
-
-    Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
-    {
-        load16(left, ARMRegisters::S0);
-        move(right, ARMRegisters::S1);
-        m_assembler.cmp_r(ARMRegisters::S0, ARMRegisters::S1);
-        return m_assembler.jmp(ARMCondition(cond));
-    }
-
     Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
     {
         load8(address, ARMRegisters::S1);

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (96168 => 96169)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h	2011-09-27 23:24:53 UTC (rev 96168)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h	2011-09-27 23:32:23 UTC (rev 96169)
@@ -965,30 +965,6 @@
         return branch32(cond, addressTempRegister, right);
     }
 
-    Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right)
-    {
-        load16(left, dataTempRegister);
-        m_assembler.lsl(addressTempRegister, right, 16);
-        m_assembler.lsl(dataTempRegister, dataTempRegister, 16);
-        return branch32(cond, dataTempRegister, addressTempRegister);
-    }
-
-    Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right)
-    {
-        ASSERT(!(0xffff0000 & right.m_value));
-        // Extract the lower 16 bits into a temp for comparison
-        m_assembler.ubfx(dataTempRegister, left, 0, 16);
-        return branch32(cond, dataTempRegister, right);
-    }
-    
-    Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
-    {
-        // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/
-        load16(left, addressTempRegister);
-        m_assembler.lsl(addressTempRegister, addressTempRegister, 16);
-        return branch32(cond, addressTempRegister, TrustedImm32(right.m_value << 16));
-    }
-
     Jump branch8(RelationalCondition cond, RegisterID left, TrustedImm32 right)
     {
         compare32(left, right);

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h (96168 => 96169)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h	2011-09-27 23:24:53 UTC (rev 96168)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h	2011-09-27 23:32:23 UTC (rev 96169)
@@ -1076,30 +1076,6 @@
         return branch32(cond, dataTempRegister, immTempRegister);
     }
 
-    Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right)
-    {
-        // Make sure the immediate value is unsigned 16 bits.
-        ASSERT(!(right.m_value & 0xFFFF0000));
-        m_assembler.andi(immTempRegister, left, 0xffff);
-        return branch32(cond, immTempRegister, right);
-    }
-
-    Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right)
-    {
-        load16(left, dataTempRegister);
-        return branch32(cond, dataTempRegister, right);
-    }
-
-    Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
-    {
-        ASSERT(!(right.m_value & 0xFFFF0000));
-        load16(left, dataTempRegister);
-        // Be careful that the previous load16() uses immTempRegister.
-        // So, we need to put move() after load16().
-        move(right, immTempRegister);
-        return branch32(cond, dataTempRegister, immTempRegister);
-    }
-
     Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask)
     {
         ASSERT((cond == Zero) || (cond == NonZero));

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h (96168 => 96169)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h	2011-09-27 23:24:53 UTC (rev 96168)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h	2011-09-27 23:32:23 UTC (rev 96169)
@@ -1395,61 +1395,6 @@
         return branch32(cond, scr, scr1);
     }
 
-    Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right)
-    {
-        ASSERT(!(right.m_value & 0xFFFF0000));
-        RegisterID scr = claimScratch();
-
-        extuw(left, scr);
-        if (((cond == Equal) || (cond == NotEqual)) && !right.m_value)
-            m_assembler.testlRegReg(scr, scr);
-        else
-            compare32(right.m_value, scr, cond);
-
-        releaseScratch(scr);
-
-        if (cond == NotEqual)
-            return branchFalse();
-        return branchTrue();
-    }
-
-    Jump branch16(RelationalCondition cond,  BaseIndex left, RegisterID right)
-    {
-        RegisterID scr = claimScratch();
-
-        move(left.index, scr);
-        lshift32(TrustedImm32(left.scale), scr);
-
-        if (left.offset)
-            add32(TrustedImm32(left.offset), scr);
-        add32(left.base, scr);
-        load16(scr, scr);
-        extuw(scr, scr);
-        releaseScratch(scr);
-
-        return branch32(cond, scr, right);
-    }
-
-    Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
-    {
-        RegisterID scr = claimScratch();
-
-        move(left.index, scr);
-        lshift32(TrustedImm32(left.scale), scr);
-
-        if (left.offset)
-            add32(TrustedImm32(left.offset), scr);
-        add32(left.base, scr);
-        load16(scr, scr);
-        extuw(scr, scr);
-        RegisterID scr1 = claimScratch();
-        m_assembler.loadConstant(right.m_value, scr1);
-        releaseScratch(scr);
-        releaseScratch(scr1);
-
-        return branch32(cond, scr, scr1);
-    }
-
     Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask)
     {
         ASSERT((cond == Zero) || (cond == NonZero));

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (96168 => 96169)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2011-09-27 23:24:53 UTC (rev 96168)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2011-09-27 23:32:23 UTC (rev 96169)
@@ -890,29 +890,6 @@
         return branch32(cond, left, right);
     }
 
-    Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right)
-    {
-        if (((cond == Equal) || (cond == NotEqual)) && !right.m_value)
-            m_assembler.testw_rr(left, left);
-        else
-            m_assembler.cmpw_ir(right.m_value, left);
-        return Jump(m_assembler.jCC(x86Condition(cond)));
-    }
-
-    Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right)
-    {
-        m_assembler.cmpw_rm(right, left.offset, left.base, left.index, left.scale);
-        return Jump(m_assembler.jCC(x86Condition(cond)));
-    }
-
-    Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
-    {
-        ASSERT(!(right.m_value & 0xFFFF0000));
-
-        m_assembler.cmpw_im(right.m_value, left.offset, left.base, left.index, left.scale);
-        return Jump(m_assembler.jCC(x86Condition(cond)));
-    }
-
     Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask)
     {
         m_assembler.testl_rr(reg, mask);

Modified: trunk/Source/_javascript_Core/yarr/YarrJIT.cpp (96168 => 96169)


--- trunk/Source/_javascript_Core/yarr/YarrJIT.cpp	2011-09-27 23:24:53 UTC (rev 96168)
+++ trunk/Source/_javascript_Core/yarr/YarrJIT.cpp	2011-09-27 23:32:23 UTC (rev 96169)
@@ -256,11 +256,19 @@
         return branch32(NotEqual, index, length);
     }
 
-    Jump jumpIfCharNotEquals(UChar ch, int inputPosition)
+    Jump jumpIfCharNotEquals(UChar ch, int inputPosition, RegisterID character)
     {
-        if (m_charSize == Char8)
-            return branch8(NotEqual, BaseIndex(input, index, TimesOne, inputPosition * sizeof(char)), Imm32(ch));
-        return branch16(NotEqual, BaseIndex(input, index, TimesTwo, inputPosition * sizeof(UChar)), Imm32(ch));
+        readCharacter(inputPosition, character);
+
+        // For case-insesitive compares, non-ascii characters that have different
+        // upper & lower case representations are converted to a character class.
+        ASSERT(!m_pattern.m_ignoreCase || isASCIIAlpha(ch) || (Unicode::toLower(ch) == Unicode::toUpper(ch)));
+        if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) {
+            or32(TrustedImm32(32), character);
+            ch = Unicode::toLower(ch);
+        }
+
+        return branch32(NotEqual, character, Imm32(ch));
     }
 
     void readCharacter(int inputPosition, RegisterID reg)
@@ -679,6 +687,9 @@
                 int mask = 0;
                 int chPair = ch | (ch2 << shiftAmount);
 
+                // For case-insesitive compares, non-ascii characters that have different
+                // upper & lower case representations are converted to a character class.
+                ASSERT(!m_pattern.m_ignoreCase || isASCIIAlpha(ch) || (Unicode::toLower(ch) == Unicode::toUpper(ch)));
                 if (m_pattern.m_ignoreCase) {
                     if (isASCIIAlpha(ch))
                         mask |= 32;
@@ -688,34 +699,21 @@
 
                 if (m_charSize == Char8) {
                     BaseIndex address(input, index, TimesOne, (term->inputPosition - m_checked) * sizeof(char));
-                    if (mask) {
-                        load16(address, character);
-                        or32(Imm32(mask), character);
-                        op.m_jumps.append(branch16(NotEqual, character, Imm32(chPair | mask)));
-                    } else
-                        op.m_jumps.append(branch16(NotEqual, address, Imm32(chPair)));
+                    load16(address, character);
                 } else {
                     BaseIndex address(input, index, TimesTwo, (term->inputPosition - m_checked) * sizeof(UChar));
-                    if (mask) {
-                        load32WithUnalignedHalfWords(address, character);
-                        or32(Imm32(mask), character);
-                        op.m_jumps.append(branch32(NotEqual, character, Imm32(chPair | mask)));
-                    } else
-                        op.m_jumps.append(branch32WithUnalignedHalfWords(NotEqual, address, Imm32(chPair)));
+                    load32WithUnalignedHalfWords(address, character);
                 }
+                if (mask)
+                    or32(Imm32(mask), character);
+                op.m_jumps.append(branch32(NotEqual, character, Imm32(chPair | mask)));
+
                 nextOp.m_isDeadCode = true;
                 return;
             }
         }
 
-        if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) {
-            readCharacter(term->inputPosition - m_checked, character);
-            or32(TrustedImm32(32), character);
-            op.m_jumps.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch))));
-        } else {
-            ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch)));
-            op.m_jumps.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked));
-        }
+        op.m_jumps.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked, character));
     }
     void backtrackPatternCharacterOnce(size_t opIndex)
     {
@@ -737,20 +735,20 @@
         Label loop(this);
         BaseIndex address(input, countRegister, m_charScale, (Checked<int>(term->inputPosition - m_checked + Checked<int64_t>(term->quantityCount)) * static_cast<int>(m_charSize == Char8 ? sizeof(char) : sizeof(UChar))).unsafeGet());
 
+        if (m_charSize == Char8)
+            load8(address, character);
+        else
+            load16(address, character);
+
+        // For case-insesitive compares, non-ascii characters that have different
+        // upper & lower case representations are converted to a character class.
+        ASSERT(!m_pattern.m_ignoreCase || isASCIIAlpha(ch) || (Unicode::toLower(ch) == Unicode::toUpper(ch)));
         if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) {
-            if (m_charSize == Char8)
-                load8(address, character);
-            else
-                load16(address, character);
             or32(TrustedImm32(32), character);
-            op.m_jumps.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch))));
-        } else {
-            ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch)));
-            if (m_charSize == Char8)
-                op.m_jumps.append(branch8(NotEqual, address, Imm32(ch)));
-            else
-                op.m_jumps.append(branch16(NotEqual, address, Imm32(ch)));
+            ch = Unicode::toLower(ch);
         }
+
+        op.m_jumps.append(branch32(NotEqual, character, Imm32(ch)));
         add32(TrustedImm32(1), countRegister);
         branch32(NotEqual, countRegister, index).linkTo(loop, this);
     }
@@ -777,14 +775,7 @@
             JumpList failures;
             Label loop(this);
             failures.append(atEndOfInput());
-            if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) {
-                readCharacter(term->inputPosition - m_checked, character);
-                or32(TrustedImm32(32), character);
-                failures.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch))));
-            } else {
-                ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch)));
-                failures.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked));
-            }
+            failures.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked, character));
 
             add32(TrustedImm32(1), countRegister);
             add32(TrustedImm32(1), index);
@@ -849,14 +840,7 @@
             nonGreedyFailures.append(atEndOfInput());
             if (term->quantityCount != quantifyInfinite)
                 nonGreedyFailures.append(branch32(Equal, countRegister, Imm32(term->quantityCount.unsafeGet())));
-            if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) {
-                readCharacter(term->inputPosition - m_checked, character);
-                or32(TrustedImm32(32), character);
-                nonGreedyFailures.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch))));
-            } else {
-                ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch)));
-                nonGreedyFailures.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked));
-            }
+            nonGreedyFailures.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked, character));
 
             add32(TrustedImm32(1), countRegister);
             add32(TrustedImm32(1), index);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to