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