Ignore:
Timestamp:
Apr 27, 2013, 4:14:04 PM (12 years ago)
Author:
[email protected]
Message:

Cleaned up pre/post inc/dec in bytecode
https://bugs.webkit.org/show_bug.cgi?id=115222

Reviewed by Filip Pizlo.

Source/JavaScriptCore:

A few related changes here:

(*) Removed post_inc and post_dec. The two-result form was awkward to
reason about. Being explicit about the intermediate mov and to_number
reduces DFG overhead, removes some fragile ASSERTs from the DFG, and
fixes a const bug. Plus, we get to blow away 262 lines of code.

(*) Renamed pre_inc and pre_dec to inc and dec, since there's only one
version now.

(*) Renamed to_jsnumber to to_number, to match the ECMA name.

(*) Tightened up the codegen and runtime support for to_number.

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::dumpBytecode):

  • bytecode/Opcode.h:

(JSC::padOpcodeName):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::emitInc):
(JSC::BytecodeGenerator::emitDec):

  • bytecompiler/BytecodeGenerator.h:

(JSC::BytecodeGenerator::emitToNumber):
(BytecodeGenerator): Removed post_inc and post_dec.

  • bytecompiler/NodesCodegen.cpp:

(JSC::emitPreIncOrDec): Updated for rename.

(JSC::emitPostIncOrDec): Issue an explicit mov and to_number when needed.
These are rare, and they boil away in the DFG.

(JSC::PostfixNode::emitResolve):
(JSC::PrefixNode::emitResolve): For const, use an explicit mov instead
of any special forms. This fixes a bug where we would do string
add/subtract instead of number.

  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::parseBlock):

  • dfg/DFGCapabilities.h:

(JSC::DFG::canCompileOpcode):

  • jit/JIT.cpp:

(JSC::JIT::privateCompileMainPass):
(JSC::JIT::privateCompileSlowCases):

  • jit/JIT.h:
  • jit/JITArithmetic.cpp:

(JSC::JIT::emit_op_inc):
(JSC::JIT::emitSlow_op_inc):
(JSC::JIT::emit_op_dec):
(JSC::JIT::emitSlow_op_dec):

  • jit/JITArithmetic32_64.cpp:

(JSC::JIT::emit_op_inc):
(JSC::JIT::emitSlow_op_inc):
(JSC::JIT::emit_op_dec):
(JSC::JIT::emitSlow_op_dec): Removed post_inc/dec, and updated for renames.

  • jit/JITOpcodes.cpp:

(JSC::JIT::emit_op_to_number):
(JSC::JIT::emitSlow_op_to_number): Removed a test for number cells. There's
no such thing!

  • jit/JITOpcodes32_64.cpp:

(JSC::JIT::emit_op_to_number): Use LowestTag to avoid making assumptions
about the lowest valued tag.

(JSC::JIT::emitSlow_op_to_number): Updated for renames.

  • jit/JITStubs.cpp:

(JSC::DEFINE_STUB_FUNCTION):

  • jit/JITStubs.h:
  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::LLINT_SLOW_PATH_DECL):

  • llint/LLIntSlowPaths.h:
  • llint/LowLevelInterpreter32_64.asm:
  • llint/LowLevelInterpreter64.asm:
  • parser/NodeConstructors.h:

(JSC::UnaryPlusNode::UnaryPlusNode): Removed post_inc/dec, and updated for renames.

  • runtime/Operations.cpp:

(JSC::jsIsObjectType): Removed a test for number cells. There's
no such thing!

LayoutTests:

  • fast/js/const-expected.txt:
  • fast/js/resources/const.js: Added tests for some const cases we used

to get wrong.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r149236 r149247  
    602602// ------------------------------ PostfixNode ----------------------------------
    603603
    604 static RegisterID* emitPreIncOrDec(BytecodeGenerator& generator, RegisterID* srcDst, Operator oper)
    605 {
    606     return (oper == OpPlusPlus) ? generator.emitPreInc(srcDst) : generator.emitPreDec(srcDst);
     604static RegisterID* emitIncOrDec(BytecodeGenerator& generator, RegisterID* srcDst, Operator oper)
     605{
     606    return (oper == OpPlusPlus) ? generator.emitInc(srcDst) : generator.emitDec(srcDst);
    607607}
    608608
    609609static RegisterID* emitPostIncOrDec(BytecodeGenerator& generator, RegisterID* dst, RegisterID* srcDst, Operator oper)
    610610{
    611     if (srcDst == dst)
    612         return generator.emitToJSNumber(dst, srcDst);
    613     return (oper == OpPlusPlus) ? generator.emitPostInc(dst, srcDst) : generator.emitPostDec(dst, srcDst);
     611    if (dst == srcDst)
     612        return generator.emitToNumber(generator.finalDestination(dst), srcDst);
     613    RefPtr<RegisterID> tmp = generator.emitToNumber(generator.tempDestination(dst), srcDst);
     614    emitIncOrDec(generator, srcDst, oper);
     615    return generator.moveToDestinationIfNeeded(dst, tmp.get());
    614616}
    615617
     
    625627    ResolveResult resolveResult = generator.resolve(ident);
    626628
    627     if (RegisterID* local = resolveResult.local()) {
     629    if (RefPtr<RegisterID> local = resolveResult.local()) {
    628630        if (resolveResult.isReadOnly()) {
    629631            generator.emitReadOnlyExceptionIfNeeded();
    630             return generator.emitToJSNumber(generator.finalDestination(dst), local);
     632            local = generator.emitMove(generator.tempDestination(dst), local.get());
    631633        }
    632         return emitPostIncOrDec(generator, generator.finalDestination(dst), local, m_operator);
     634        return emitPostIncOrDec(generator, generator.finalDestination(dst), local.get(), m_operator);
    633635    }
    634636
     
    806808
    807809    ResolveResult resolveResult = generator.resolve(ident);
    808     if (RegisterID* local = resolveResult.local()) {
     810    if (RefPtr<RegisterID> local = resolveResult.local()) {
    809811        if (resolveResult.isReadOnly()) {
    810812            generator.emitReadOnlyExceptionIfNeeded();
    811             if (dst == generator.ignoredResult())
    812                 return generator.emitToJSNumber(generator.newTemporary(), local);
    813             RefPtr<RegisterID> r0 = generator.emitLoad(generator.tempDestination(dst), (m_operator == OpPlusPlus) ? 1.0 : -1.0);
    814             generator.emitBinaryOp(op_add, r0.get(), local, r0.get(), OperandTypes());
    815             return generator.moveToDestinationIfNeeded(dst, r0.get());
     813            local = generator.emitMove(generator.tempDestination(dst), local.get());
    816814        }
    817         emitPreIncOrDec(generator, local, m_operator);
    818         return generator.moveToDestinationIfNeeded(dst, local);
     815        emitIncOrDec(generator, local.get(), m_operator);
     816        return generator.moveToDestinationIfNeeded(dst, local.get());
    819817    }
    820818
    821819    if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {
    822820        RefPtr<RegisterID> propDst = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult, ident);
    823         emitPreIncOrDec(generator, propDst.get(), m_operator);
     821        emitIncOrDec(generator, propDst.get(), m_operator);
    824822        generator.emitPutStaticVar(resolveResult, ident, propDst.get());
    825823        return generator.moveToDestinationIfNeeded(dst, propDst.get());
     
    830828    NonlocalResolveInfo resolveVerifier;
    831829    RefPtr<RegisterID> base = generator.emitResolveWithBaseForPut(generator.newTemporary(), propDst.get(), resolveResult, ident, resolveVerifier);
    832     emitPreIncOrDec(generator, propDst.get(), m_operator);
     830    emitIncOrDec(generator, propDst.get(), m_operator);
    833831    generator.emitPutToBase(base.get(), ident, propDst.get(), resolveVerifier);
    834832    return generator.moveToDestinationIfNeeded(dst, propDst.get());
     
    848846    generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->startOffset(), bracketAccessor->endOffset());
    849847    RegisterID* value = generator.emitGetByVal(propDst.get(), base.get(), property.get());
    850     emitPreIncOrDec(generator, value, m_operator);
     848    emitIncOrDec(generator, value, m_operator);
    851849    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    852850    generator.emitPutByVal(base.get(), property.get(), value);
     
    866864    generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->startOffset(), dotAccessor->endOffset());
    867865    RegisterID* value = generator.emitGetById(propDst.get(), base.get(), ident);
    868     emitPreIncOrDec(generator, value, m_operator);
     866    emitIncOrDec(generator, value, m_operator);
    869867    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    870868    generator.emitPutById(base.get(), ident, value);
Note: See TracChangeset for help on using the changeset viewer.