Changeset 36738 in webkit for trunk/JavaScriptCore/VM


Ignore:
Timestamp:
Sep 21, 2008, 3:39:29 AM (17 years ago)
Author:
[email protected]
Message:

2008-09-21 Maciej Stachowiak <[email protected]>

Reviewed by Oliver.


  • VM/CTI.cpp: (JSC::CTI::emitJumpSlowCaseIfNotImmediateNumber): (JSC::CTI::emitJumpSlowCaseIfNotImmediateNumbers): (JSC::CTI::emitJumpSlowCaseIfNotImmediates): (JSC::CTI::emitTagAsBoolImmediate): (JSC::CTI::privateCompileMainPass): (JSC::CTI::privateCompileSlowCases):
  • VM/CTI.h:
  • VM/Machine.cpp: (JSC::Machine::cti_op_stricteq):
  • masm/X86Assembler.h: (JSC::X86Assembler::): (JSC::X86Assembler::sete_r): (JSC::X86Assembler::setz_r): (JSC::X86Assembler::movzbl_rr): (JSC::X86Assembler::emitUnlinkedJnz):
Location:
trunk/JavaScriptCore/VM
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/VM/CTI.cpp

    r36695 r36738  
    388388}
    389389
     390ALWAYS_INLINE void CTI::emitTagAsBoolImmediate(X86Assembler::RegisterID reg)
     391{
     392    m_jit.shl_i8r(JSImmediate::ExtendedPayloadShift, reg);
     393    m_jit.orl_i32r(JSImmediate::FullTagTypeBool, reg);
     394}
     395
    390396CTI::CTI(Machine* machine, ExecState* exec, CodeBlock* codeBlock)
    391397    : m_jit(machine->jitCodeBuffer())
     
    13751381        CTI_COMPILE_UNARY_OP(op_is_object)
    13761382        CTI_COMPILE_UNARY_OP(op_is_function)
    1377         CTI_COMPILE_BINARY_OP(op_stricteq)
    13781383        CTI_COMPILE_BINARY_OP(op_nstricteq)
     1384        case op_stricteq: {
     1385            unsigned dst = instruction[i + 1].u.operand;
     1386            unsigned src1 = instruction[i + 2].u.operand;
     1387            unsigned src2 = instruction[i + 3].u.operand;
     1388
     1389            emitGetArg(src1, X86::eax);
     1390            emitGetArg(src2, X86::edx);
     1391
     1392            m_jit.testl_i32r(JSImmediate::TagMask, X86::eax);
     1393            X86Assembler::JmpSrc firstNotImmediate = m_jit.emitUnlinkedJe();
     1394            m_jit.testl_i32r(JSImmediate::TagMask, X86::edx);
     1395            X86Assembler::JmpSrc secondNotImmediate = m_jit.emitUnlinkedJe();
     1396
     1397            m_jit.cmpl_rr(X86::edx, X86::eax);
     1398            m_jit.sete_r(X86::eax);
     1399            m_jit.movzbl_rr(X86::eax, X86::eax);
     1400            emitTagAsBoolImmediate(X86::eax);
     1401           
     1402            X86Assembler::JmpSrc bothWereImmediates = m_jit.emitUnlinkedJmp();
     1403
     1404            m_jit.link(firstNotImmediate, m_jit.label());
     1405
     1406            // check that edx is immediate but not the zero immediate
     1407           
     1408            m_jit.testl_i32r(JSImmediate::TagMask, X86::edx);
     1409            m_jit.setz_r(X86::ecx);
     1410            m_jit.movzbl_rr(X86::ecx, X86::ecx); // ecx is now 1 if edx was nonimmediate
     1411            m_jit.cmpl_i32r(reinterpret_cast<uint32_t>(JSImmediate::zeroImmediate()), X86::edx);
     1412            m_jit.sete_r(X86::edx);
     1413            m_jit.movzbl_rr(X86::edx, X86::edx); // edx is now 1 if edx was the 0 immediate
     1414            m_jit.orl_rr(X86::ecx, X86::edx);
     1415
     1416            m_slowCases.append(SlowCaseEntry(m_jit.emitUnlinkedJnz(), i));
     1417
     1418            m_jit.movl_i32r(reinterpret_cast<uint32_t>(jsBoolean(false)), X86::eax);
     1419
     1420            X86Assembler::JmpSrc firstWasNotImmediate = m_jit.emitUnlinkedJmp();
     1421
     1422            m_jit.link(secondNotImmediate, m_jit.label());
     1423            // check that eax is not the zero immediate (we know it must be immediate)
     1424            m_jit.cmpl_i32r(reinterpret_cast<uint32_t>(JSImmediate::zeroImmediate()), X86::eax);
     1425            m_slowCases.append(SlowCaseEntry(m_jit.emitUnlinkedJe(), i));
     1426
     1427            m_jit.movl_i32r(reinterpret_cast<uint32_t>(jsBoolean(false)), X86::eax);
     1428
     1429            m_jit.link(bothWereImmediates, m_jit.label());
     1430            m_jit.link(firstWasNotImmediate, m_jit.label());
     1431
     1432            emitPutResult(dst);
     1433           
     1434            i += 4;
     1435            break;
     1436        }
    13791437        case op_to_jsnumber: {
    13801438            emitGetPutArg(instruction[i + 2].u.operand, 0, X86::ecx);
     
    19732031            break;
    19742032        }
     2033        CTI_COMPILE_BINARY_OP_SLOW_CASE(op_stricteq);
     2034
    19752035        case op_mod: {
    19762036            X86Assembler::JmpSrc notImm1 = iter->from;
  • trunk/JavaScriptCore/VM/CTI.h

    r36695 r36738  
    371371        void emitFastArithIntToImmNoCheck(X86Assembler::RegisterID);
    372372
     373        void emitTagAsBoolImmediate(X86Assembler::RegisterID reg);
     374
    373375        void emitDebugExceptionCheck();
    374376
  • trunk/JavaScriptCore/VM/Machine.cpp

    r36727 r36738  
    53005300    JSValue* src2 = ARG_src2;
    53015301
    5302     if (JSImmediate::areBothImmediate(src1, src2))
    5303         return jsBoolean(reinterpret_cast<intptr_t>(src1) == reinterpret_cast<intptr_t>(src2));
    5304     if (JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate()))
    5305         return jsBoolean(false);
     5302    // handled inline as fast cases
     5303    ASSERT(!JSImmediate::areBothImmediate(src1, src2));
     5304    ASSERT(!(JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate())));
    53065305
    53075306    return jsBoolean(strictEqualSlowCaseInline(src1, src2));
Note: See TracChangeset for help on using the changeset viewer.