Changeset 34497 in webkit


Ignore:
Timestamp:
Jun 11, 2008 12:48:15 PM (16 years ago)
Author:
cwzwarich@webkit.org
Message:

2008-06-11 Cameron Zwarich <cwzwarich@uwaterloo.ca>

Reviewed by Darin.

Bug 19457: Create fused opcodes for tests and conditional jumps
<https://bugs.webkit.org/show_bug.cgi?id=19457>

Add a new jless instruction, and modify the code generator to emit it
instead of the pair (less, jtrue).

Gives a 3.6% improvement on SunSpider.

  • VM/CodeBlock.cpp: (KJS::CodeBlock::dump):
  • VM/CodeGenerator.cpp: (KJS::CodeGenerator::CodeGenerator): (KJS::CodeGenerator::emitOpcode): (KJS::CodeGenerator::retrieveLastBinaryOp): (KJS::CodeGenerator::rewindBinaryOp): (KJS::CodeGenerator::emitJump): (KJS::CodeGenerator::emitJumpIfTrue): (KJS::CodeGenerator::emitJumpIfFalse): (KJS::CodeGenerator::emitMove): (KJS::CodeGenerator::emitNot): (KJS::CodeGenerator::emitEqual): (KJS::CodeGenerator::emitNotEqual): (KJS::CodeGenerator::emitStrictEqual): (KJS::CodeGenerator::emitNotStrictEqual): (KJS::CodeGenerator::emitLess): (KJS::CodeGenerator::emitLessEq): (KJS::CodeGenerator::emitPreInc): (KJS::CodeGenerator::emitPreDec): (KJS::CodeGenerator::emitPostInc): (KJS::CodeGenerator::emitPostDec): (KJS::CodeGenerator::emitToJSNumber): (KJS::CodeGenerator::emitNegate): (KJS::CodeGenerator::emitAdd): (KJS::CodeGenerator::emitMul): (KJS::CodeGenerator::emitDiv): (KJS::CodeGenerator::emitMod): (KJS::CodeGenerator::emitSub): (KJS::CodeGenerator::emitLeftShift): (KJS::CodeGenerator::emitRightShift): (KJS::CodeGenerator::emitUnsignedRightShift): (KJS::CodeGenerator::emitBitAnd): (KJS::CodeGenerator::emitBitXOr): (KJS::CodeGenerator::emitBitOr): (KJS::CodeGenerator::emitBitNot): (KJS::CodeGenerator::emitInstanceOf): (KJS::CodeGenerator::emitTypeOf): (KJS::CodeGenerator::emitIn): (KJS::CodeGenerator::emitLoad): (KJS::CodeGenerator::emitNewObject): (KJS::CodeGenerator::emitNewArray): (KJS::CodeGenerator::emitResolve): (KJS::CodeGenerator::emitGetScopedVar): (KJS::CodeGenerator::emitPutScopedVar): (KJS::CodeGenerator::emitResolveBase): (KJS::CodeGenerator::emitResolveWithBase): (KJS::CodeGenerator::emitResolveFunction): (KJS::CodeGenerator::emitGetById): (KJS::CodeGenerator::emitPutById): (KJS::CodeGenerator::emitPutGetter): (KJS::CodeGenerator::emitPutSetter): (KJS::CodeGenerator::emitDeleteById): (KJS::CodeGenerator::emitGetByVal): (KJS::CodeGenerator::emitPutByVal): (KJS::CodeGenerator::emitDeleteByVal): (KJS::CodeGenerator::emitPutByIndex): (KJS::CodeGenerator::emitNewFunction): (KJS::CodeGenerator::emitNewRegExp): (KJS::CodeGenerator::emitNewFunctionExpression): (KJS::CodeGenerator::emitCall): (KJS::CodeGenerator::emitReturn): (KJS::CodeGenerator::emitEnd): (KJS::CodeGenerator::emitConstruct): (KJS::CodeGenerator::emitPushScope): (KJS::CodeGenerator::emitPopScope): (KJS::CodeGenerator::emitDebugHook): (KJS::CodeGenerator::emitComplexJumpScopes): (KJS::CodeGenerator::emitJumpScopes): (KJS::CodeGenerator::emitNextPropertyName): (KJS::CodeGenerator::emitGetPropertyNames): (KJS::CodeGenerator::emitCatch): (KJS::CodeGenerator::emitThrow): (KJS::CodeGenerator::emitNewError): (KJS::CodeGenerator::emitJumpSubroutine): (KJS::CodeGenerator::emitSubroutineReturn):
  • VM/CodeGenerator.h:
  • VM/Machine.cpp: (KJS::Machine::privateExecute):
  • VM/Opcode.cpp: (KJS::):
  • VM/Opcode.h:
Location:
trunk/JavaScriptCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r34496 r34497  
     12008-06-11  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
     2
     3        Reviewed by Darin.
     4
     5        Bug 19457: Create fused opcodes for tests and conditional jumps
     6        <https://bugs.webkit.org/show_bug.cgi?id=19457>
     7
     8        Add a new jless instruction, and modify the code generator to emit it
     9        instead of the pair (less, jtrue).
     10
     11        Gives a 3.6% improvement on SunSpider.
     12
     13        * VM/CodeBlock.cpp:
     14        (KJS::CodeBlock::dump):
     15        * VM/CodeGenerator.cpp:
     16        (KJS::CodeGenerator::CodeGenerator):
     17        (KJS::CodeGenerator::emitOpcode):
     18        (KJS::CodeGenerator::retrieveLastBinaryOp):
     19        (KJS::CodeGenerator::rewindBinaryOp):
     20        (KJS::CodeGenerator::emitJump):
     21        (KJS::CodeGenerator::emitJumpIfTrue):
     22        (KJS::CodeGenerator::emitJumpIfFalse):
     23        (KJS::CodeGenerator::emitMove):
     24        (KJS::CodeGenerator::emitNot):
     25        (KJS::CodeGenerator::emitEqual):
     26        (KJS::CodeGenerator::emitNotEqual):
     27        (KJS::CodeGenerator::emitStrictEqual):
     28        (KJS::CodeGenerator::emitNotStrictEqual):
     29        (KJS::CodeGenerator::emitLess):
     30        (KJS::CodeGenerator::emitLessEq):
     31        (KJS::CodeGenerator::emitPreInc):
     32        (KJS::CodeGenerator::emitPreDec):
     33        (KJS::CodeGenerator::emitPostInc):
     34        (KJS::CodeGenerator::emitPostDec):
     35        (KJS::CodeGenerator::emitToJSNumber):
     36        (KJS::CodeGenerator::emitNegate):
     37        (KJS::CodeGenerator::emitAdd):
     38        (KJS::CodeGenerator::emitMul):
     39        (KJS::CodeGenerator::emitDiv):
     40        (KJS::CodeGenerator::emitMod):
     41        (KJS::CodeGenerator::emitSub):
     42        (KJS::CodeGenerator::emitLeftShift):
     43        (KJS::CodeGenerator::emitRightShift):
     44        (KJS::CodeGenerator::emitUnsignedRightShift):
     45        (KJS::CodeGenerator::emitBitAnd):
     46        (KJS::CodeGenerator::emitBitXOr):
     47        (KJS::CodeGenerator::emitBitOr):
     48        (KJS::CodeGenerator::emitBitNot):
     49        (KJS::CodeGenerator::emitInstanceOf):
     50        (KJS::CodeGenerator::emitTypeOf):
     51        (KJS::CodeGenerator::emitIn):
     52        (KJS::CodeGenerator::emitLoad):
     53        (KJS::CodeGenerator::emitNewObject):
     54        (KJS::CodeGenerator::emitNewArray):
     55        (KJS::CodeGenerator::emitResolve):
     56        (KJS::CodeGenerator::emitGetScopedVar):
     57        (KJS::CodeGenerator::emitPutScopedVar):
     58        (KJS::CodeGenerator::emitResolveBase):
     59        (KJS::CodeGenerator::emitResolveWithBase):
     60        (KJS::CodeGenerator::emitResolveFunction):
     61        (KJS::CodeGenerator::emitGetById):
     62        (KJS::CodeGenerator::emitPutById):
     63        (KJS::CodeGenerator::emitPutGetter):
     64        (KJS::CodeGenerator::emitPutSetter):
     65        (KJS::CodeGenerator::emitDeleteById):
     66        (KJS::CodeGenerator::emitGetByVal):
     67        (KJS::CodeGenerator::emitPutByVal):
     68        (KJS::CodeGenerator::emitDeleteByVal):
     69        (KJS::CodeGenerator::emitPutByIndex):
     70        (KJS::CodeGenerator::emitNewFunction):
     71        (KJS::CodeGenerator::emitNewRegExp):
     72        (KJS::CodeGenerator::emitNewFunctionExpression):
     73        (KJS::CodeGenerator::emitCall):
     74        (KJS::CodeGenerator::emitReturn):
     75        (KJS::CodeGenerator::emitEnd):
     76        (KJS::CodeGenerator::emitConstruct):
     77        (KJS::CodeGenerator::emitPushScope):
     78        (KJS::CodeGenerator::emitPopScope):
     79        (KJS::CodeGenerator::emitDebugHook):
     80        (KJS::CodeGenerator::emitComplexJumpScopes):
     81        (KJS::CodeGenerator::emitJumpScopes):
     82        (KJS::CodeGenerator::emitNextPropertyName):
     83        (KJS::CodeGenerator::emitGetPropertyNames):
     84        (KJS::CodeGenerator::emitCatch):
     85        (KJS::CodeGenerator::emitThrow):
     86        (KJS::CodeGenerator::emitNewError):
     87        (KJS::CodeGenerator::emitJumpSubroutine):
     88        (KJS::CodeGenerator::emitSubroutineReturn):
     89        * VM/CodeGenerator.h:
     90        * VM/Machine.cpp:
     91        (KJS::Machine::privateExecute):
     92        * VM/Opcode.cpp:
     93        (KJS::):
     94        * VM/Opcode.h:
     95
    1962008-06-11  Darin Adler  <darin@apple.com>
    297
  • trunk/JavaScriptCore/VM/CodeBlock.cpp

    r34372 r34497  
    468468            break;
    469469        }
     470        case op_jless: {
     471            int r0 = (++it)->u.operand;
     472            int r1 = (++it)->u.operand;
     473            int offset = (++it)->u.operand;
     474            printf("[%4d] jless\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, jumpTarget(begin, it, offset));
     475            break;
     476        }
    470477        case op_new_func: {
    471478            int r0 = (++it)->u.operand;
  • trunk/JavaScriptCore/VM/CodeGenerator.cpp

    r34412 r34497  
    181181    , m_nextVar(-1)
    182182    , m_propertyNames(&scopeChain.globalObject()->globalExec()->propertyNames())
     183    , m_lastOpcodeID(op_end)
    183184{
    184185    // Global code can inherit previously defined symbols.
     
    239240    , m_nextVar(-1)
    240241    , m_propertyNames(&scopeChain.globalObject()->globalExec()->propertyNames())
     242    , m_lastOpcodeID(op_end)
    241243{
    242244    const Node::FunctionStack& functionStack = functionBody->functionStack();
     
    286288    , m_nextVar(-1)
    287289    , m_propertyNames(&scopeChain.globalObject()->globalExec()->propertyNames())
     290    , m_lastOpcodeID(op_end)
    288291{
    289292    m_codeBlock->numVars = 1; // Allocate space for "this"
     
    384387}
    385388
     389void CodeGenerator::emitOpcode(OpcodeID opcodeID)
     390{
     391    instructions().append(machine().getOpcode(opcodeID));
     392    m_lastOpcodeID = opcodeID;
     393}
     394
     395void CodeGenerator::retrieveLastBinaryOp(int& dstIndex, int& src1Index, int& src2Index)
     396{
     397    ASSERT(instructions().size() >= 4);
     398    size_t size = instructions().size();
     399    dstIndex = instructions().at(size - 3).u.operand;
     400    src1Index = instructions().at(size - 2).u.operand;
     401    src2Index = instructions().at(size - 1).u.operand;
     402}
     403
     404void CodeGenerator::rewindBinaryOp()
     405{
     406    ASSERT(instructions().size() >= 4);
     407    instructions().shrink(instructions().size() - 4);
     408}
     409
    386410PassRefPtr<LabelID> CodeGenerator::emitJump(LabelID* target)
    387411{
    388     instructions().append(machine().getOpcode(op_jmp));
     412    emitOpcode(op_jmp);
    389413    instructions().append(target->offsetFrom(instructions().size()));
    390414    return target;
     
    393417PassRefPtr<LabelID> CodeGenerator::emitJumpIfTrue(RegisterID* cond, LabelID* target)
    394418{
    395     instructions().append(machine().getOpcode(op_jtrue));
     419    if (m_lastOpcodeID == op_less) {
     420        int dstIndex;
     421        int src1Index;
     422        int src2Index;
     423       
     424        retrieveLastBinaryOp(dstIndex, src1Index, src2Index);
     425       
     426        if (cond->index() == dstIndex) {
     427            rewindBinaryOp();
     428            emitOpcode(op_jless);
     429            instructions().append(src1Index);
     430            instructions().append(src2Index);
     431            instructions().append(target->offsetFrom(instructions().size()));
     432            return target;
     433        }
     434    }
     435   
     436    emitOpcode(op_jtrue);
    396437    instructions().append(cond->index());
    397438    instructions().append(target->offsetFrom(instructions().size()));
     
    401442PassRefPtr<LabelID> CodeGenerator::emitJumpIfFalse(RegisterID* cond, LabelID* target)
    402443{
    403     instructions().append(machine().getOpcode(op_jfalse));
     444    emitOpcode(op_jfalse);
    404445    instructions().append(cond->index());
    405446    instructions().append(target->offsetFrom(instructions().size()));
     
    451492RegisterID* CodeGenerator::emitMove(RegisterID* dst, RegisterID* src)
    452493{
    453     instructions().append(machine().getOpcode(op_mov));
     494    emitOpcode(op_mov);
    454495    instructions().append(dst->index());
    455496    instructions().append(src->index());
     
    459500RegisterID* CodeGenerator::emitNot(RegisterID* dst, RegisterID* src)
    460501{
    461     instructions().append(machine().getOpcode(op_not));
     502    emitOpcode(op_not);
    462503    instructions().append(dst->index());
    463504    instructions().append(src->index());
     
    467508RegisterID* CodeGenerator::emitEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    468509{
    469     instructions().append(machine().getOpcode(op_eq));
     510    emitOpcode(op_eq);
    470511    instructions().append(dst->index());
    471512    instructions().append(src1->index());
     
    476517RegisterID* CodeGenerator::emitNotEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    477518{
    478     instructions().append(machine().getOpcode(op_neq));
     519    emitOpcode(op_neq);
    479520    instructions().append(dst->index());
    480521    instructions().append(src1->index());
     
    485526RegisterID* CodeGenerator::emitStrictEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    486527{
    487     instructions().append(machine().getOpcode(op_stricteq));
     528    emitOpcode(op_stricteq);
    488529    instructions().append(dst->index());
    489530    instructions().append(src1->index());
     
    494535RegisterID* CodeGenerator::emitNotStrictEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    495536{
    496     instructions().append(machine().getOpcode(op_nstricteq));
     537    emitOpcode(op_nstricteq);
    497538    instructions().append(dst->index());
    498539    instructions().append(src1->index());
     
    503544RegisterID* CodeGenerator::emitLess(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    504545{
    505     instructions().append(machine().getOpcode(op_less));
     546    emitOpcode(op_less);
    506547    instructions().append(dst->index());
    507548    instructions().append(src1->index());
     
    512553RegisterID* CodeGenerator::emitLessEq(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    513554{
    514     instructions().append(machine().getOpcode(op_lesseq));
     555    emitOpcode(op_lesseq);
    515556    instructions().append(dst->index());
    516557    instructions().append(src1->index());
     
    521562RegisterID* CodeGenerator::emitPreInc(RegisterID* srcDst)
    522563{
    523     instructions().append(machine().getOpcode(op_pre_inc));
     564    emitOpcode(op_pre_inc);
    524565    instructions().append(srcDst->index());
    525566    return srcDst;
     
    528569RegisterID* CodeGenerator::emitPreDec(RegisterID* srcDst)
    529570{
    530     instructions().append(machine().getOpcode(op_pre_dec));
     571    emitOpcode(op_pre_dec);
    531572    instructions().append(srcDst->index());
    532573    return srcDst;
     
    535576RegisterID* CodeGenerator::emitPostInc(RegisterID* dst, RegisterID* srcDst)
    536577{
    537     instructions().append(machine().getOpcode(op_post_inc));
     578    emitOpcode(op_post_inc);
    538579    instructions().append(dst->index());
    539580    instructions().append(srcDst->index());
     
    543584RegisterID* CodeGenerator::emitPostDec(RegisterID* dst, RegisterID* srcDst)
    544585{
    545     instructions().append(machine().getOpcode(op_post_dec));
     586    emitOpcode(op_post_dec);
    546587    instructions().append(dst->index());
    547588    instructions().append(srcDst->index());
     
    551592RegisterID* CodeGenerator::emitToJSNumber(RegisterID* dst, RegisterID* src)
    552593{
    553     instructions().append(machine().getOpcode(op_to_jsnumber));
     594    emitOpcode(op_to_jsnumber);
    554595    instructions().append(dst->index());
    555596    instructions().append(src->index());
     
    559600RegisterID* CodeGenerator::emitNegate(RegisterID* dst, RegisterID* src)
    560601{
    561     instructions().append(machine().getOpcode(op_negate));
     602    emitOpcode(op_negate);
    562603    instructions().append(dst->index());
    563604    instructions().append(src->index());
     
    567608RegisterID* CodeGenerator::emitAdd(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    568609{
    569     instructions().append(machine().getOpcode(op_add));
     610    emitOpcode(op_add);
    570611    instructions().append(dst->index());
    571612    instructions().append(src1->index());
     
    576617RegisterID* CodeGenerator::emitMul(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    577618{
    578     instructions().append(machine().getOpcode(op_mul));
     619    emitOpcode(op_mul);
    579620    instructions().append(dst->index());
    580621    instructions().append(src1->index());
     
    585626RegisterID* CodeGenerator::emitDiv(RegisterID* dst, RegisterID* dividend, RegisterID* divisor)
    586627{
    587     instructions().append(machine().getOpcode(op_div));
     628    emitOpcode(op_div);
    588629    instructions().append(dst->index());
    589630    instructions().append(dividend->index());
     
    594635RegisterID* CodeGenerator::emitMod(RegisterID* dst, RegisterID* dividend, RegisterID* divisor)
    595636{
    596     instructions().append(machine().getOpcode(op_mod));
     637    emitOpcode(op_mod);
    597638    instructions().append(dst->index());
    598639    instructions().append(dividend->index());
     
    603644RegisterID* CodeGenerator::emitSub(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    604645{
    605     instructions().append(machine().getOpcode(op_sub));
     646    emitOpcode(op_sub);
    606647    instructions().append(dst->index());
    607648    instructions().append(src1->index());
     
    612653RegisterID* CodeGenerator::emitLeftShift(RegisterID* dst, RegisterID* val, RegisterID* shift)
    613654{
    614     instructions().append(machine().getOpcode(op_lshift));
     655    emitOpcode(op_lshift);
    615656    instructions().append(dst->index());
    616657    instructions().append(val->index());
     
    621662RegisterID* CodeGenerator::emitRightShift(RegisterID* dst, RegisterID* val, RegisterID* shift)
    622663{
    623     instructions().append(machine().getOpcode(op_rshift));
     664    emitOpcode(op_rshift);
    624665    instructions().append(dst->index());
    625666    instructions().append(val->index());
     
    630671RegisterID* CodeGenerator::emitUnsignedRightShift(RegisterID* dst, RegisterID* val, RegisterID* shift)
    631672{
    632     instructions().append(machine().getOpcode(op_urshift));
     673    emitOpcode(op_urshift);
    633674    instructions().append(dst->index());
    634675    instructions().append(val->index());
     
    639680RegisterID* CodeGenerator::emitBitAnd(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    640681{
    641     instructions().append(machine().getOpcode(op_bitand));
     682    emitOpcode(op_bitand);
    642683    instructions().append(dst->index());
    643684    instructions().append(src1->index());
     
    648689RegisterID* CodeGenerator::emitBitXOr(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    649690{
    650     instructions().append(machine().getOpcode(op_bitxor));
     691    emitOpcode(op_bitxor);
    651692    instructions().append(dst->index());
    652693    instructions().append(src1->index());
     
    657698RegisterID* CodeGenerator::emitBitOr(RegisterID* dst, RegisterID* src1, RegisterID* src2)
    658699{
    659     instructions().append(machine().getOpcode(op_bitor));
     700    emitOpcode(op_bitor);
    660701    instructions().append(dst->index());
    661702    instructions().append(src1->index());
     
    666707RegisterID* CodeGenerator::emitBitNot(RegisterID* dst, RegisterID* src)
    667708{
    668     instructions().append(machine().getOpcode(op_bitnot));
     709    emitOpcode(op_bitnot);
    669710    instructions().append(dst->index());
    670711    instructions().append(src->index());
     
    674715RegisterID* CodeGenerator::emitInstanceOf(RegisterID* dst, RegisterID* value, RegisterID* base)
    675716{
    676     instructions().append(machine().getOpcode(op_instanceof));
     717    emitOpcode(op_instanceof);
    677718    instructions().append(dst->index());
    678719    instructions().append(value->index());
     
    683724RegisterID* CodeGenerator::emitTypeOf(RegisterID* dst, RegisterID* src)
    684725{
    685     instructions().append(machine().getOpcode(op_typeof));
     726    emitOpcode(op_typeof);
    686727    instructions().append(dst->index());
    687728    instructions().append(src->index());
     
    691732RegisterID* CodeGenerator::emitIn(RegisterID* dst, RegisterID* property, RegisterID* base)
    692733{
    693     instructions().append(machine().getOpcode(op_in));
     734    emitOpcode(op_in);
    694735    instructions().append(dst->index());
    695736    instructions().append(property->index());
     
    700741RegisterID* CodeGenerator::emitLoad(RegisterID* dst, bool b)
    701742{
    702     instructions().append(machine().getOpcode(op_load));
     743    emitOpcode(op_load);
    703744    instructions().append(dst->index());
    704745    instructions().append(addConstant(jsBoolean(b)));
     
    708749RegisterID* CodeGenerator::emitLoad(RegisterID* dst, double d)
    709750{
    710     instructions().append(machine().getOpcode(op_load));
     751    emitOpcode(op_load);
    711752    instructions().append(dst->index());
    712753    instructions().append(addConstant(jsNumber(d)));
     
    716757RegisterID* CodeGenerator::emitLoad(RegisterID* dst, JSValue* v)
    717758{
    718     instructions().append(machine().getOpcode(op_load));
     759    emitOpcode(op_load);
    719760    instructions().append(dst->index());
    720761    instructions().append(addConstant(v));
     
    724765RegisterID* CodeGenerator::emitNewObject(RegisterID* dst)
    725766{
    726     instructions().append(machine().getOpcode(op_new_object));
     767    emitOpcode(op_new_object);
    727768    instructions().append(dst->index());
    728769    return dst;
     
    731772RegisterID* CodeGenerator::emitNewArray(RegisterID* dst)
    732773{
    733     instructions().append(machine().getOpcode(op_new_array));
     774    emitOpcode(op_new_array);
    734775    instructions().append(dst->index());
    735776    return dst;
     
    778819    if (!findScopedProperty(property, index, depth)) {
    779820        // We can't optimise at all :-(
    780         instructions().append(machine().getOpcode(op_resolve));
     821        emitOpcode(op_resolve);
    781822        instructions().append(dst->index());
    782823        instructions().append(addConstant(property));
     
    787828        // In this case we are at least able to drop a few scope chains from the
    788829        // lookup chain, although we still need to hash from then on.
    789         instructions().append(machine().getOpcode(op_resolve_skip));
     830        emitOpcode(op_resolve_skip);
    790831        instructions().append(dst->index());
    791832        instructions().append(addConstant(property));
     
    800841RegisterID* CodeGenerator::emitGetScopedVar(RegisterID* dst, size_t depth, int index)
    801842{
    802     instructions().append(machine().getOpcode(op_get_scoped_var));
     843    emitOpcode(op_get_scoped_var);
    803844    instructions().append(dst->index());
    804845    instructions().append(index);
     
    809850RegisterID* CodeGenerator::emitPutScopedVar(size_t depth, int index, RegisterID* value)
    810851{
    811     instructions().append(machine().getOpcode(op_put_scoped_var));
     852    emitOpcode(op_put_scoped_var);
    812853    instructions().append(index);
    813854    instructions().append(depth);
     
    818859RegisterID* CodeGenerator::emitResolveBase(RegisterID* dst, const Identifier& property)
    819860{
    820     instructions().append(machine().getOpcode(op_resolve_base));
     861    emitOpcode(op_resolve_base);
    821862    instructions().append(dst->index());
    822863    instructions().append(addConstant(property));
     
    826867RegisterID* CodeGenerator::emitResolveWithBase(RegisterID* baseDst, RegisterID* propDst, const Identifier& property)
    827868{
    828     instructions().append(machine().getOpcode(op_resolve_with_base));
     869    emitOpcode(op_resolve_with_base);
    829870    instructions().append(baseDst->index());
    830871    instructions().append(propDst->index());
     
    835876RegisterID* CodeGenerator::emitResolveFunction(RegisterID* baseDst, RegisterID* funcDst, const Identifier& property)
    836877{
    837     instructions().append(machine().getOpcode(op_resolve_func));
     878    emitOpcode(op_resolve_func);
    838879    instructions().append(baseDst->index());
    839880    instructions().append(funcDst->index());
     
    844885RegisterID* CodeGenerator::emitGetById(RegisterID* dst, RegisterID* base, const Identifier& property)
    845886{
    846     instructions().append(machine().getOpcode(op_get_by_id));
     887    emitOpcode(op_get_by_id);
    847888    instructions().append(dst->index());
    848889    instructions().append(base->index());
     
    853894RegisterID* CodeGenerator::emitPutById(RegisterID* base, const Identifier& property, RegisterID* value)
    854895{
    855     instructions().append(machine().getOpcode(op_put_by_id));
     896    emitOpcode(op_put_by_id);
    856897    instructions().append(base->index());
    857898    instructions().append(addConstant(property));
     
    862903RegisterID* CodeGenerator::emitPutGetter(RegisterID* base, const Identifier& property, RegisterID* value)
    863904{
    864     instructions().append(machine().getOpcode(op_put_getter));
     905    emitOpcode(op_put_getter);
    865906    instructions().append(base->index());
    866907    instructions().append(addConstant(property));
     
    871912RegisterID* CodeGenerator::emitPutSetter(RegisterID* base, const Identifier& property, RegisterID* value)
    872913{
    873     instructions().append(machine().getOpcode(op_put_setter));
     914    emitOpcode(op_put_setter);
    874915    instructions().append(base->index());
    875916    instructions().append(addConstant(property));
     
    880921RegisterID* CodeGenerator::emitDeleteById(RegisterID* dst, RegisterID* base, const Identifier& property)
    881922{
    882     instructions().append(machine().getOpcode(op_del_by_id));
     923    emitOpcode(op_del_by_id);
    883924    instructions().append(dst->index());
    884925    instructions().append(base->index());
     
    889930RegisterID* CodeGenerator::emitGetByVal(RegisterID* dst, RegisterID* base, RegisterID* property)
    890931{
    891     instructions().append(machine().getOpcode(op_get_by_val));
     932    emitOpcode(op_get_by_val);
    892933    instructions().append(dst->index());
    893934    instructions().append(base->index());
     
    898939RegisterID* CodeGenerator::emitPutByVal(RegisterID* base, RegisterID* property, RegisterID* value)
    899940{
    900     instructions().append(machine().getOpcode(op_put_by_val));
     941    emitOpcode(op_put_by_val);
    901942    instructions().append(base->index());
    902943    instructions().append(property->index());
     
    907948RegisterID* CodeGenerator::emitDeleteByVal(RegisterID* dst, RegisterID* base, RegisterID* property)
    908949{
    909     instructions().append(machine().getOpcode(op_del_by_val));
     950    emitOpcode(op_del_by_val);
    910951    instructions().append(dst->index());
    911952    instructions().append(base->index());
     
    916957RegisterID* CodeGenerator::emitPutByIndex(RegisterID* base, unsigned index, RegisterID* value)
    917958{
    918     instructions().append(machine().getOpcode(op_put_by_index));
     959    emitOpcode(op_put_by_index);
    919960    instructions().append(base->index());
    920961    instructions().append(index);
     
    925966RegisterID* CodeGenerator::emitNewFunction(RegisterID* r0, FuncDeclNode* n)
    926967{
    927     instructions().append(machine().getOpcode(op_new_func));
     968    emitOpcode(op_new_func);
    928969    instructions().append(r0->index());
    929970    instructions().append(addConstant(n));
     
    933974RegisterID* CodeGenerator::emitNewRegExp(RegisterID* dst, RegExp* regExp)
    934975{
    935     instructions().append(machine().getOpcode(op_new_regexp));
     976    emitOpcode(op_new_regexp);
    936977    instructions().append(dst->index());
    937978    instructions().append(addRegExp(regExp));
     
    942983RegisterID* CodeGenerator::emitNewFunctionExpression(RegisterID* r0, FuncExprNode* n)
    943984{
    944     instructions().append(machine().getOpcode(op_new_func_exp));
     985    emitOpcode(op_new_func_exp);
    945986    instructions().append(r0->index());
    946987    instructions().append(addConstant(n));
     
    9781019    }
    9791020
    980     instructions().append(machine().getOpcode(opcodeID));
     1021    emitOpcode(opcodeID);
    9811022    instructions().append(dst->index());
    9821023    instructions().append(func->index());
     
    9891030RegisterID* CodeGenerator::emitReturn(RegisterID* r0)
    9901031{
    991     instructions().append(machine().getOpcode(op_ret));
     1032    emitOpcode(op_ret);
    9921033    instructions().append(r0->index());
    9931034    return r0;
     
    9961037RegisterID* CodeGenerator::emitEnd(RegisterID* dst)
    9971038{
    998     instructions().append(machine().getOpcode(op_end));
     1039    emitOpcode(op_end);
    9991040    instructions().append(dst->index());
    10001041    return dst;
     
    10161057    }
    10171058
    1018     instructions().append(machine().getOpcode(op_construct));
     1059    emitOpcode(op_construct);
    10191060    instructions().append(dst->index());
    10201061    instructions().append(func->index());
     
    10271068{
    10281069    m_codeBlock->needsFullScopeChain = true;
    1029     instructions().append(machine().getOpcode(op_push_scope));
     1070    emitOpcode(op_push_scope);
    10301071    instructions().append(scope->index());
    10311072
     
    10421083    ASSERT(!m_scopeContextStack.last().isFinallyBlock);
    10431084
    1044     instructions().append(machine().getOpcode(op_pop_scope));
     1085    emitOpcode(op_pop_scope);
    10451086
    10461087    m_scopeContextStack.removeLast();
     
    10521093    if (!m_shouldEmitDebugHooks)
    10531094        return;
    1054     instructions().append(machine().getOpcode(op_debug));
     1095    emitOpcode(op_debug);
    10551096    instructions().append(debugHookID);
    10561097    instructions().append(firstLine);
     
    11531194            // We need to remove a number of dynamic scopes to get to the next
    11541195            // finally block
    1155             instructions().append(machine().getOpcode(op_jmp_scopes));
     1196            emitOpcode(op_jmp_scopes);
    11561197            instructions().append(nNormalScopes);
    11571198
     
    11941235        return emitComplexJumpScopes(target, &m_scopeContextStack.last(), &m_scopeContextStack.last() - scopeDelta);
    11951236
    1196     instructions().append(machine().getOpcode(op_jmp_scopes));
     1237    emitOpcode(op_jmp_scopes);
    11971238    instructions().append(scopeDelta);
    11981239    instructions().append(target->offsetFrom(instructions().size()));
     
    12021243RegisterID* CodeGenerator::emitNextPropertyName(RegisterID* dst, RegisterID* iter, LabelID* target)
    12031244{
    1204     instructions().append(machine().getOpcode(op_next_pname));
     1245    emitOpcode(op_next_pname);
    12051246    instructions().append(dst->index());
    12061247    instructions().append(iter->index());
     
    12111252RegisterID* CodeGenerator::emitGetPropertyNames(RegisterID* dst, RegisterID* base)
    12121253{
    1213     instructions().append(machine().getOpcode(op_get_pnames));
     1254    emitOpcode(op_get_pnames);
    12141255    instructions().append(dst->index());
    12151256    instructions().append(base->index());
     
    12211262    HandlerInfo info = { start->offsetFrom(0), end->offsetFrom(0), instructions().size(), m_dynamicScopeDepth };
    12221263    exceptionHandlers().append(info);
    1223     instructions().append(machine().getOpcode(op_catch));
     1264    emitOpcode(op_catch);
    12241265    instructions().append(targetRegister->index());
    12251266    return targetRegister;
     
    12281269void CodeGenerator::emitThrow(RegisterID* exception)
    12291270{
    1230     instructions().append(machine().getOpcode(op_throw));
     1271    emitOpcode(op_throw);
    12311272    instructions().append(exception->index());
    12321273}
     
    12341275RegisterID* CodeGenerator::emitNewError(RegisterID* dst, ErrorType type, JSValue* message)
    12351276{
    1236     instructions().append(machine().getOpcode(op_new_error));
     1277    emitOpcode(op_new_error);
    12371278    instructions().append(dst->index());
    12381279    instructions().append(static_cast<int>(type));
     
    12431284PassRefPtr<LabelID> CodeGenerator::emitJumpSubroutine(RegisterID* retAddrDst, LabelID* finally)
    12441285{
    1245     instructions().append(machine().getOpcode(op_jsr));
     1286    emitOpcode(op_jsr);
    12461287    instructions().append(retAddrDst->index());
    12471288    instructions().append(finally->offsetFrom(instructions().size()));
     
    12511292void CodeGenerator::emitSubroutineReturn(RegisterID* retAddrSrc)
    12521293{
    1253     instructions().append(machine().getOpcode(op_sret));
     1294    emitOpcode(op_sret);
    12541295    instructions().append(retAddrSrc->index());
    12551296}
  • trunk/JavaScriptCore/VM/CodeGenerator.h

    r34412 r34497  
    294294
    295295    private:
     296        void emitOpcode(OpcodeID);
     297        void retrieveLastBinaryOp(int& dstIndex, int& src1Index, int& src2Index);
     298        void rewindBinaryOp();
     299
    296300        PassRefPtr<LabelID> emitComplexJumpScopes(LabelID* target, ControlFlowContext* topScope, ControlFlowContext* bottomScope);
    297301        struct JSValueHashTraits : HashTraits<JSValue*> {
     
    374378        const CommonIdentifiers* m_propertyNames;
    375379
     380        OpcodeID m_lastOpcodeID;
     381
    376382#ifndef NDEBUG
    377383        static bool s_dumpsGeneratedCode;
  • trunk/JavaScriptCore/VM/Machine.cpp

    r34457 r34497  
    19131913        NEXT_OPCODE;
    19141914    }
     1915    BEGIN_OPCODE(op_jless) {
     1916        /* jless src1(r) src2(r) target(offset)
     1917
     1918           Checks whether register src1 is less than register src2, as
     1919           with the ECMAScript '<' operator, and then jumps to offset
     1920           target from the current instruction, if and only if the
     1921           result of the comparison is true.
     1922        */
     1923        JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
     1924        JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     1925        int target = (++vPC)->u.operand;
     1926
     1927        bool result = jsLess(exec, src1, src2);
     1928        VM_CHECK_EXCEPTION();
     1929       
     1930        if (result) {
     1931            vPC += target;
     1932            NEXT_OPCODE;
     1933        }
     1934
     1935        ++vPC;
     1936        NEXT_OPCODE;
     1937    }
    19151938    BEGIN_OPCODE(op_new_func) {
    19161939        /* new_func dst(r) func(f)
  • trunk/JavaScriptCore/VM/Opcode.cpp

    r34411 r34497  
    104104    "jtrue",
    105105    "jfalse",
     106    "jless",
    106107    "jmp_scopes",
    107108
  • trunk/JavaScriptCore/VM/Opcode.h

    r34411 r34497  
    9696        macro(op_jtrue) \
    9797        macro(op_jfalse) \
     98        macro(op_jless) \
    9899        macro(op_jmp_scopes) \
    99100        \
Note: See TracChangeset for help on using the changeset viewer.