Ignore:
Timestamp:
Sep 12, 2011, 3:17:53 PM (14 years ago)
Author:
[email protected]
Message:

Update RegExp and related classes to use 8 bit strings when available
https://bugs.webkit.org/show_bug.cgi?id=67337

Source/JavaScriptCore:

Modified both the Yarr interpreter and JIT to handle 8 bit subject strings.
The code paths are triggered by the UString::is8bit() method which currently
returns false. Implemented JIT changes for all current architectures.
Tested X86_64 and ARM v7.

This includes some code that will likely change as we complete the
8 bit string changes. This includes the way the raw buffer pointers
are accessed as well as replacing the CharAccess class with a
string interator returned from UString.

Fixed build breakage in testRegExp.cpp due to globalObject construction
changes.

Reviewed by Gavin Barraclough.

(GlobalObject::finishCreation):
(GlobalObject::GlobalObject):

  • assembler/ARMAssembler.cpp:

(JSC::ARMAssembler::baseIndexTransfer32):

  • assembler/ARMAssembler.h:
  • assembler/ARMv7Assembler.h:

(JSC::ARMv7Assembler::ubfx):
(JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp12Reg40Imm3Reg4Imm20Imm5):

  • assembler/MacroAssemblerARM.h:

(JSC::MacroAssemblerARM::load8):
(JSC::MacroAssemblerARM::branch8):
(JSC::MacroAssemblerARM::branch16):

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::load8):
(JSC::MacroAssemblerARMv7::branch16):
(JSC::MacroAssemblerARMv7::branch8):

  • assembler/MacroAssemblerMIPS.h:

(JSC::MacroAssemblerMIPS::load8):
(JSC::MacroAssemblerMIPS::branch8):
(JSC::MacroAssemblerMIPS::branch16):

  • assembler/MacroAssemblerSH4.h:

(JSC::MacroAssemblerSH4::load8):
(JSC::MacroAssemblerSH4::branch8):
(JSC::MacroAssemblerSH4::branch16):

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86Common::load8):
(JSC::MacroAssemblerX86Common::branch16):
(JSC::MacroAssemblerX86Common::branch8):

  • assembler/SH4Assembler.h:

(JSC::SH4Assembler::extub):
(JSC::SH4Assembler::printInstr):

  • assembler/X86Assembler.h:

(JSC::X86Assembler::cmpw_ir):
(JSC::X86Assembler::movzbl_mr):

  • runtime/RegExp.cpp:

(JSC::RegExp::compile):
(JSC::RegExp::compileIfNecessary):
(JSC::RegExp::match):
(JSC::RegExp::matchCompareWithInterpreter):

  • runtime/RegExp.h:
  • runtime/UString.h:

(JSC::UString::is8Bit):

  • yarr/Yarr.h:
  • yarr/YarrInterpreter.cpp:

(JSC::Yarr::Interpreter::CharAccess::CharAccess):
(JSC::Yarr::Interpreter::CharAccess::~CharAccess):
(JSC::Yarr::Interpreter::CharAccess::operator[]):
(JSC::Yarr::Interpreter::InputStream::InputStream):
(JSC::Yarr::Interpreter::Interpreter):
(JSC::Yarr::interpret):

  • yarr/YarrJIT.cpp:

(JSC::Yarr::YarrGenerator::jumpIfCharNotEquals):
(JSC::Yarr::YarrGenerator::readCharacter):
(JSC::Yarr::YarrGenerator::generatePatternCharacterOnce):
(JSC::Yarr::YarrGenerator::generatePatternCharacterFixed):
(JSC::Yarr::YarrGenerator::generatePatternCharacterGreedy):
(JSC::Yarr::YarrGenerator::backtrackPatternCharacterNonGreedy):
(JSC::Yarr::YarrGenerator::generateCharacterClassFixed):
(JSC::Yarr::YarrGenerator::generateDotStarEnclosure):
(JSC::Yarr::YarrGenerator::YarrGenerator):
(JSC::Yarr::YarrGenerator::compile):
(JSC::Yarr::jitCompile):
(JSC::Yarr::execute):

  • yarr/YarrJIT.h:

(JSC::Yarr::YarrCodeBlock::has8BitCode):
(JSC::Yarr::YarrCodeBlock::has16BitCode):
(JSC::Yarr::YarrCodeBlock::set8BitCode):
(JSC::Yarr::YarrCodeBlock::set16BitCode):
(JSC::Yarr::YarrCodeBlock::execute):

  • yarr/YarrParser.h:

(JSC::Yarr::Parser::Parser):

Source/WebCore:

Updated call to match to use UString& instead of UChar*.

Reviewed by Gavin Barraclough.

No new tests, Covered by existing tests.

  • platform/text/RegularExpression.cpp:

(WebCore::RegularExpression::match):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h

    r90687 r94981  
    497497    }
    498498
     499    void load8(BaseIndex address, RegisterID dest)
     500    {
     501        if (address.offset >= -32768 && address.offset <= 32767
     502            && !m_fixedWidth) {
     503            /*
     504             sll     addrTemp, address.index, address.scale
     505             addu    addrTemp, addrTemp, address.base
     506             lbu     dest, address.offset(addrTemp)
     507             */
     508            m_assembler.sll(addrTempRegister, address.index, address.scale);
     509            m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
     510            m_assembler.lbu(dest, addrTempRegister, address.offset);
     511        } else {
     512            /*
     513             sll     addrTemp, address.index, address.scale
     514             addu    addrTemp, addrTemp, address.base
     515             lui     immTemp, (address.offset + 0x8000) >> 16
     516             addu    addrTemp, addrTemp, immTemp
     517             lbu     dest, (address.offset & 0xffff)(at)
     518             */
     519            m_assembler.sll(addrTempRegister, address.index, address.scale);
     520            m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
     521            m_assembler.lui(immTempRegister, (address.offset + 0x8000) >> 16);
     522            m_assembler.addu(addrTempRegister, addrTempRegister,
     523                             immTempRegister);
     524            m_assembler.lbu(dest, addrTempRegister, address.offset);
     525        }
     526    }
     527
    499528    void load32(ImplicitAddress address, RegisterID dest)
    500529    {
     
    933962    }
    934963
     964    Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
     965    {
     966        ASSERT(!(right.m_value & 0xFFFFFF00));
     967        load8(left, dataTempRegister);
     968        // Be careful that the previous load8() uses immTempRegister.
     969        // So, we need to put move() after load8().
     970        move(right, immTempRegister);
     971        return branch32(cond, dataTempRegister, immTempRegister);
     972    }
     973
    935974    Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right)
    936975    {
     
    10311070        move(right, immTempRegister);
    10321071        return branch32(cond, dataTempRegister, immTempRegister);
     1072    }
     1073
     1074    Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right)
     1075    {
     1076        // Make sure the immediate value is unsigned 16 bits.
     1077        ASSERT(!(right.m_value & 0xFFFF0000));
     1078        m_assembler.andi(immTempRegister, left, 0xffff);
     1079        return branch32(cond, immTempRegister, right);
    10331080    }
    10341081
Note: See TracChangeset for help on using the changeset viewer.