Changeset 36738 in webkit for trunk/JavaScriptCore/VM
- Timestamp:
- Sep 21, 2008, 3:39:29 AM (17 years ago)
- Location:
- trunk/JavaScriptCore/VM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/VM/CTI.cpp
r36695 r36738 388 388 } 389 389 390 ALWAYS_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 390 396 CTI::CTI(Machine* machine, ExecState* exec, CodeBlock* codeBlock) 391 397 : m_jit(machine->jitCodeBuffer()) … … 1375 1381 CTI_COMPILE_UNARY_OP(op_is_object) 1376 1382 CTI_COMPILE_UNARY_OP(op_is_function) 1377 CTI_COMPILE_BINARY_OP(op_stricteq)1378 1383 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 } 1379 1437 case op_to_jsnumber: { 1380 1438 emitGetPutArg(instruction[i + 2].u.operand, 0, X86::ecx); … … 1973 2031 break; 1974 2032 } 2033 CTI_COMPILE_BINARY_OP_SLOW_CASE(op_stricteq); 2034 1975 2035 case op_mod: { 1976 2036 X86Assembler::JmpSrc notImm1 = iter->from; -
trunk/JavaScriptCore/VM/CTI.h
r36695 r36738 371 371 void emitFastArithIntToImmNoCheck(X86Assembler::RegisterID); 372 372 373 void emitTagAsBoolImmediate(X86Assembler::RegisterID reg); 374 373 375 void emitDebugExceptionCheck(); 374 376 -
trunk/JavaScriptCore/VM/Machine.cpp
r36727 r36738 5300 5300 JSValue* src2 = ARG_src2; 5301 5301 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()))); 5306 5305 5307 5306 return jsBoolean(strictEqualSlowCaseInline(src1, src2));
Note:
See TracChangeset
for help on using the changeset viewer.