Changeset 243642 in webkit for trunk/Source/JavaScriptCore/yarr/YarrJIT.cpp
- Timestamp:
- Mar 28, 2019, 11:05:55 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/yarr/YarrJIT.cpp
r243237 r243642 73 73 static const RegisterID initialStart = ARM64Registers::x11; 74 74 static const RegisterID supplementaryPlanesBase = ARM64Registers::x12; 75 static const RegisterID surrogateTagMask= ARM64Registers::x13;76 static const RegisterID leadingSurrogateTag = ARM64Registers::x14;77 static const RegisterID trailingSurrogateTag= ARM64Registers::x15;75 static const RegisterID leadingSurrogateTag = ARM64Registers::x13; 76 static const RegisterID trailingSurrogateTag = ARM64Registers::x14; 77 static const RegisterID endOfStringAddress = ARM64Registers::x15; 78 78 79 79 static const RegisterID returnRegister = ARM64Registers::x0; 80 80 static const RegisterID returnRegister2 = ARM64Registers::x1; 81 81 82 const TrustedImm32 surrogateTagMask = TrustedImm32(0xfffffc00); 82 83 #define HAVE_INITIAL_START_REG 83 84 #define JIT_UNICODE_EXPRESSIONS … … 144 145 static const RegisterID regUnicodeInputAndTrail = X86Registers::r13; 145 146 static const RegisterID leadingSurrogateTag = X86Registers::r14; 146 static const RegisterID trailingSurrogateTag= X86Registers::r15;147 static const RegisterID endOfStringAddress = X86Registers::r15; 147 148 148 149 static const RegisterID returnRegister = X86Registers::eax; … … 150 151 151 152 const TrustedImm32 supplementaryPlanesBase = TrustedImm32(0x10000); 153 const TrustedImm32 trailingSurrogateTag = TrustedImm32(0xdc00); 152 154 const TrustedImm32 surrogateTagMask = TrustedImm32(0xfffffc00); 153 155 #define HAVE_INITIAL_START_REG … … 320 322 if ((term.type == PatternTerm::TypeCharacterClass) 321 323 && (term.quantityType == QuantifierFixedCount) 322 && (!m_decodeSurrogatePairs || ( !term.characterClass->m_hasNonBMPCharacters&& !term.m_invert))324 && (!m_decodeSurrogatePairs || (term.characterClass->hasOneCharacterSize() && !term.m_invert)) 323 325 && (nextTerm.type == PatternTerm::TypePatternCharacter) 324 326 && (nextTerm.quantityType == QuantifierFixedCount)) { … … 384 386 return; 385 387 } 388 386 389 JumpList unicodeFail; 387 390 if (charClass->m_matchesUnicode.size() || charClass->m_rangesUnicode.size()) { … … 448 451 unicodeFail.link(this); 449 452 } 453 454 #ifdef JIT_UNICODE_EXPRESSIONS 455 void advanceIndexAfterCharacterClassTermMatch(const PatternTerm* term, JumpList& failures, const RegisterID character) 456 { 457 ASSERT(term->type == PatternTerm::TypeCharacterClass); 458 459 if (term->characterClass->hasOneCharacterSize() && !term->invert()) 460 add32(TrustedImm32(term->characterClass->hasNonBMPCharacters() ? 2 : 1), index); 461 else { 462 add32(TrustedImm32(1), index); 463 failures.append(atEndOfInput()); 464 Jump isBMPChar = branch32(LessThan, character, supplementaryPlanesBase); 465 add32(TrustedImm32(1), index); 466 isBMPChar.link(this); 467 } 468 } 469 #endif 450 470 451 471 // Jumps if input not available; will have (incorrectly) incremented already! … … 521 541 522 542 JumpList notUnicode; 543 523 544 load16Unaligned(regUnicodeInputAndTrail, resultReg); 524 545 and32(surrogateTagMask, resultReg, regT2); 525 546 notUnicode.append(branch32(NotEqual, regT2, leadingSurrogateTag)); 526 547 addPtr(TrustedImm32(2), regUnicodeInputAndTrail); 527 getEffectiveAddress(BaseIndex(input, length, TimesTwo), regT2); 528 notUnicode.append(branch32(AboveOrEqual, regUnicodeInputAndTrail, regT2)); 548 notUnicode.append(branchPtr(AboveOrEqual, regUnicodeInputAndTrail, endOfStringAddress)); 529 549 load16Unaligned(Address(regUnicodeInputAndTrail), regUnicodeInputAndTrail); 530 550 and32(surrogateTagMask, regUnicodeInputAndTrail, regT2); … … 1735 1755 } 1736 1756 #ifdef JIT_UNICODE_EXPRESSIONS 1737 if (m_decodeSurrogatePairs ) {1757 if (m_decodeSurrogatePairs && (!term->characterClass->hasOneCharacterSize() || term->invert())) { 1738 1758 Jump isBMPChar = branch32(LessThan, character, supplementaryPlanesBase); 1739 1759 add32(TrustedImm32(1), index); … … 1769 1789 1770 1790 move(index, countRegister); 1771 sub32(Imm32(term->quantityMaxCount.unsafeGet()), countRegister); 1791 1792 Checked<unsigned> scaledMaxCount = term->quantityMaxCount; 1793 1794 #ifdef JIT_UNICODE_EXPRESSIONS 1795 if (m_decodeSurrogatePairs && term->characterClass->hasOnlyNonBMPCharacters() && !term->invert()) 1796 scaledMaxCount *= 2; 1797 #endif 1798 sub32(Imm32(scaledMaxCount.unsafeGet()), countRegister); 1772 1799 1773 1800 Label loop(this); 1774 1801 JumpList matchDest; 1775 readCharacter(m_checkedOffset - term->inputPosition - term->quantityMaxCount, character, countRegister);1802 readCharacter(m_checkedOffset - term->inputPosition - scaledMaxCount, character, countRegister); 1776 1803 // If we are matching the "any character" builtin class we only need to read the 1777 1804 // character and don't need to match as it will always succeed. … … 1787 1814 } 1788 1815 1789 add32(TrustedImm32(1), countRegister);1790 1816 #ifdef JIT_UNICODE_EXPRESSIONS 1791 1817 if (m_decodeSurrogatePairs) { 1792 Jump isBMPChar = branch32(LessThan, character, supplementaryPlanesBase); 1793 op.m_jumps.append(atEndOfInput()); 1818 if (term->characterClass->hasOneCharacterSize() && !term->invert()) 1819 add32(TrustedImm32(term->characterClass->hasNonBMPCharacters() ? 2 : 1), countRegister); 1820 else { 1821 add32(TrustedImm32(1), countRegister); 1822 Jump isBMPChar = branch32(LessThan, character, supplementaryPlanesBase); 1823 op.m_jumps.append(atEndOfInput()); 1824 add32(TrustedImm32(1), countRegister); 1825 add32(TrustedImm32(1), index); 1826 isBMPChar.link(this); 1827 } 1828 } else 1829 #endif 1794 1830 add32(TrustedImm32(1), countRegister); 1795 add32(TrustedImm32(1), index);1796 isBMPChar.link(this);1797 }1798 #endif1799 1831 branch32(NotEqual, countRegister, index).linkTo(loop, this); 1800 1832 } … … 1812 1844 const RegisterID countRegister = regT1; 1813 1845 1814 if (m_decodeSurrogatePairs )1846 if (m_decodeSurrogatePairs && (!term->characterClass->hasOneCharacterSize() || term->invert())) 1815 1847 storeToFrame(index, term->frameLocation + BackTrackInfoCharacterClass::beginIndex()); 1816 1848 move(TrustedImm32(0), countRegister); … … 1826 1858 JumpList matchDest; 1827 1859 readCharacter(m_checkedOffset - term->inputPosition, character); 1828 // If we are matching the "any character" builtin class we only need to read the1829 // character and don't need to match as it will always succeed.1860 // If we are matching the "any character" builtin class for non-unicode patterns, 1861 // we only need to read the character and don't need to match as it will always succeed. 1830 1862 if (!term->characterClass->m_anyCharacter) { 1831 1863 matchCharacterClass(character, matchDest, term->characterClass); … … 1835 1867 } 1836 1868 1837 add32(TrustedImm32(1), index);1838 1869 #ifdef JIT_UNICODE_EXPRESSIONS 1839 if (m_decodeSurrogatePairs) { 1840 failures.append(atEndOfInput()); 1841 Jump isBMPChar = branch32(LessThan, character, supplementaryPlanesBase); 1870 if (m_decodeSurrogatePairs) 1871 advanceIndexAfterCharacterClassTermMatch(term, failures, character); 1872 else 1873 #endif 1842 1874 add32(TrustedImm32(1), index); 1843 isBMPChar.link(this);1844 }1845 #endif1846 1875 add32(TrustedImm32(1), countRegister); 1847 1876 … … 1869 1898 m_backtrackingState.append(branchTest32(Zero, countRegister)); 1870 1899 sub32(TrustedImm32(1), countRegister); 1900 storeToFrame(countRegister, term->frameLocation + BackTrackInfoCharacterClass::matchAmountIndex()); 1901 1871 1902 if (!m_decodeSurrogatePairs) 1872 1903 sub32(TrustedImm32(1), index); 1904 else if (term->characterClass->hasOneCharacterSize() && !term->invert()) 1905 sub32(TrustedImm32(term->characterClass->hasNonBMPCharacters() ? 2 : 1), index); 1873 1906 else { 1907 // Rematch one less 1874 1908 const RegisterID character = regT0; 1875 1909 1876 1910 loadFromFrame(term->frameLocation + BackTrackInfoCharacterClass::beginIndex(), index); 1877 // Rematch one less1878 storeToFrame(countRegister, term->frameLocation + BackTrackInfoCharacterClass::matchAmountIndex());1879 1911 1880 1912 Label rematchLoop(this); … … 1906 1938 move(TrustedImm32(0), countRegister); 1907 1939 op.m_reentry = label(); 1908 if (m_decodeSurrogatePairs) 1909 storeToFrame(index, term->frameLocation + BackTrackInfoCharacterClass::beginIndex()); 1910 storeToFrame(countRegister, term->frameLocation + BackTrackInfoCharacterClass::matchAmountIndex()); 1940 if (m_decodeSurrogatePairs) { 1941 if (!term->characterClass->hasOneCharacterSize() || term->invert()) 1942 storeToFrame(index, term->frameLocation + BackTrackInfoCharacterClass::beginIndex()); 1943 storeToFrame(countRegister, term->frameLocation + BackTrackInfoCharacterClass::matchAmountIndex()); 1944 } 1911 1945 } 1912 1946 … … 1923 1957 m_backtrackingState.link(this); 1924 1958 1925 if (m_decodeSurrogatePairs) 1926 loadFromFrame(term->frameLocation + BackTrackInfoCharacterClass::beginIndex(), index); 1927 loadFromFrame(term->frameLocation + BackTrackInfoCharacterClass::matchAmountIndex(), countRegister); 1959 if (m_decodeSurrogatePairs) { 1960 if (!term->characterClass->hasOneCharacterSize() || term->invert()) 1961 loadFromFrame(term->frameLocation + BackTrackInfoCharacterClass::beginIndex(), index); 1962 loadFromFrame(term->frameLocation + BackTrackInfoCharacterClass::matchAmountIndex(), countRegister); 1963 } 1928 1964 1929 1965 nonGreedyFailures.append(atEndOfInput()); … … 1932 1968 JumpList matchDest; 1933 1969 readCharacter(m_checkedOffset - term->inputPosition, character); 1934 // If we are matching the "any character" builtin class we only need to read the1935 // character and don't need to match as it will always succeed.1970 // If we are matching the "any character" builtin class for non-unicode patterns, 1971 // we only need to read the character and don't need to match as it will always succeed. 1936 1972 if (term->invert() || !term->characterClass->m_anyCharacter) { 1937 1973 matchCharacterClass(character, matchDest, term->characterClass); … … 1945 1981 } 1946 1982 1947 add32(TrustedImm32(1), index);1948 1983 #ifdef JIT_UNICODE_EXPRESSIONS 1949 if (m_decodeSurrogatePairs) { 1950 nonGreedyFailures.append(atEndOfInput()); 1951 Jump isBMPChar = branch32(LessThan, character, supplementaryPlanesBase); 1984 if (m_decodeSurrogatePairs) 1985 advanceIndexAfterCharacterClassTermMatch(term, nonGreedyFailures, character); 1986 else 1987 #endif 1952 1988 add32(TrustedImm32(1), index); 1953 isBMPChar.link(this);1954 }1955 #endif1956 1989 add32(TrustedImm32(1), countRegister); 1957 1990 … … 3701 3734 3702 3735 move(TrustedImm32(0xd800), leadingSurrogateTag); 3703 move(TrustedImm32(0xdc00), trailingSurrogateTag);3704 3736 } 3705 3737 // The ABI doesn't guarantee the upper bits are zero on unsigned arguments, so clear them ourselves. … … 3735 3767 pushPair(framePointerRegister, linkRegister); 3736 3768 move(TrustedImm32(0x10000), supplementaryPlanesBase); 3737 move(TrustedImm32(0xfffffc00), surrogateTagMask);3738 3769 move(TrustedImm32(0xd800), leadingSurrogateTag); 3739 3770 move(TrustedImm32(0xdc00), trailingSurrogateTag); … … 3816 3847 , m_decodeSurrogatePairs(m_charSize == Char16 && m_pattern.unicode()) 3817 3848 , m_unicodeIgnoreCase(m_pattern.unicode() && m_pattern.ignoreCase()) 3849 , m_fixedSizedAlternative(false) 3818 3850 , m_canonicalMode(m_pattern.unicode() ? CanonicalMode::Unicode : CanonicalMode::UCS2) 3819 3851 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) … … 3869 3901 generateFailReturn(); 3870 3902 hasInput.link(this); 3903 3904 #ifdef JIT_UNICODE_EXPRESSIONS 3905 if (m_decodeSurrogatePairs) 3906 getEffectiveAddress(BaseIndex(input, length, TimesTwo), endOfStringAddress); 3907 #endif 3871 3908 3872 3909 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) … … 4164 4201 bool m_decodeSurrogatePairs; 4165 4202 bool m_unicodeIgnoreCase; 4203 bool m_fixedSizedAlternative; 4166 4204 CanonicalMode m_canonicalMode; 4167 4205 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
Note:
See TracChangeset
for help on using the changeset viewer.