Changeset 39122 in webkit for trunk/JavaScriptCore/jit/JIT.cpp


Ignore:
Timestamp:
Dec 8, 2008, 8:54:16 PM (16 years ago)
Author:
[email protected]
Message:

2008-12-08 Gavin Barraclough <[email protected]>

Reviewed by Oliver Hunt.

Port the op_j?n?eq_null JIT code generation to use the MacroAssembler,
and clean up slightly at the same time. The 'j' forms currently compare,
then set a register, then compare again, then branch. Branch directly on
the result of the first compare.

Around a 1% progression on deltablue, crypto & early boyer, for about 1/2%
overall on v8-tests.

  • jit/JIT.cpp: (JSC::JIT::privateCompileMainPass):
  • jit/JITPropertyAccess.cpp: (JSC::JIT::compileGetByIdSlowCase):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/jit/JIT.cpp

    r39121 r39122  
    821821
    822822            emitGetVirtualRegister(src, X86::eax, i);
    823             JmpSrc isImmediate = emitJumpIfNotJSCell(X86::eax);
    824 
    825             __ movl_mr(FIELD_OFFSET(JSCell, m_structure), X86::eax, X86::ecx);
    826             __ testl_i32m(MasqueradesAsUndefined, FIELD_OFFSET(Structure, m_typeInfo.m_flags), X86::ecx);
    827             __ setnz_r(X86::eax);
    828 
    829             JmpSrc wasNotImmediate = __ jmp();
    830 
    831             __ link(isImmediate, __ label());
    832 
    833             __ movl_i32r(~JSImmediate::ExtendedTagBitUndefined, X86::ecx);
    834             __ andl_rr(X86::eax, X86::ecx);
    835             __ cmpl_i32r(JSImmediate::FullTagTypeNull, X86::ecx);
    836             __ sete_r(X86::eax);
    837 
    838             __ link(wasNotImmediate, __ label());
    839 
    840             __ movzbl_rr(X86::eax, X86::eax);
    841             __ cmpl_i32r(0, X86::eax);
    842             m_jmpTable.append(JmpTable(__ jnz(), i + 2 + target));           
    843 
     823            Jump isImmediate = emitJumpIfNotJSCell(X86::eax);
     824
     825            // First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure.
     826            loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx);
     827            m_jmpTable.append(JmpTable(jnz32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), i + 2 + target));
     828            Jump wasNotImmediate = jump();
     829
     830            // Now handle the immediate cases - undefined & null
     831            isImmediate.link(this);
     832            and32(Imm32(~JSImmediate::ExtendedTagBitUndefined), X86::eax);
     833            m_jmpTable.append(JmpTable(je32(X86::eax, Imm32(asInteger(jsNull()))), i + 2 + target));           
     834
     835            wasNotImmediate.link(this);
    844836            i += 3;
    845837            break;
     
    850842
    851843            emitGetVirtualRegister(src, X86::eax, i);
    852             JmpSrc isImmediate = emitJumpIfNotJSCell(X86::eax);
    853 
    854             __ movl_mr(FIELD_OFFSET(JSCell, m_structure), X86::eax, X86::ecx);
    855             __ testl_i32m(MasqueradesAsUndefined, FIELD_OFFSET(Structure, m_typeInfo.m_flags), X86::ecx);
    856             __ setz_r(X86::eax);
    857 
    858             JmpSrc wasNotImmediate = __ jmp();
    859 
    860             __ link(isImmediate, __ label());
    861 
    862             __ movl_i32r(~JSImmediate::ExtendedTagBitUndefined, X86::ecx);
    863             __ andl_rr(X86::eax, X86::ecx);
    864             __ cmpl_i32r(JSImmediate::FullTagTypeNull, X86::ecx);
    865             __ setne_r(X86::eax);
    866 
    867             __ link(wasNotImmediate, __ label());
    868 
    869             __ movzbl_rr(X86::eax, X86::eax);
    870             __ cmpl_i32r(0, X86::eax);
    871             m_jmpTable.append(JmpTable(__ jnz(), i + 2 + target));           
     844            Jump isImmediate = emitJumpIfNotJSCell(X86::eax);
     845
     846            // First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure.
     847            loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx);
     848            m_jmpTable.append(JmpTable(jz32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), i + 2 + target));
     849            Jump wasNotImmediate = jump();
     850
     851            // Now handle the immediate cases - undefined & null
     852            isImmediate.link(this);
     853            and32(Imm32(~JSImmediate::ExtendedTagBitUndefined), X86::eax);
     854            m_jmpTable.append(JmpTable(jne32(X86::eax, Imm32(asInteger(jsNull()))), i + 2 + target));           
     855
     856            wasNotImmediate.link(this);
    872857
    873858            i += 3;
     
    13021287
    13031288            emitGetVirtualRegister(src1, X86::eax, i);
    1304             JmpSrc isImmediate = emitJumpIfNotJSCell(X86::eax);
    1305 
    1306             __ movl_mr(FIELD_OFFSET(JSCell, m_structure), X86::eax, X86::ecx);
    1307             __ testl_i32m(MasqueradesAsUndefined, FIELD_OFFSET(Structure, m_typeInfo.m_flags), X86::ecx);
    1308             __ setnz_r(X86::eax);
    1309 
    1310             JmpSrc wasNotImmediate = __ jmp();
    1311 
    1312             __ link(isImmediate, __ label());
    1313 
    1314             __ movl_i32r(~JSImmediate::ExtendedTagBitUndefined, X86::ecx);
    1315             __ andl_rr(X86::eax, X86::ecx);
    1316             __ cmpl_i32r(JSImmediate::FullTagTypeNull, X86::ecx);
    1317             __ sete_r(X86::eax);
    1318 
    1319             __ link(wasNotImmediate, __ label());
    1320 
    1321             __ movzbl_rr(X86::eax, X86::eax);
     1289            Jump isImmediate = emitJumpIfNotJSCell(X86::eax);
     1290
     1291            loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx);
     1292            setnz32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), X86::eax);
     1293
     1294            Jump wasNotImmediate = jump();
     1295
     1296            isImmediate.link(this);
     1297
     1298            and32(Imm32(~JSImmediate::ExtendedTagBitUndefined), X86::eax);
     1299            sete32(Imm32(JSImmediate::FullTagTypeNull), X86::eax);
     1300
     1301            wasNotImmediate.link(this);
     1302
    13221303            emitTagAsBoolImmediate(X86::eax);
    13231304            emitPutVirtualRegister(dst);
     
    13311312
    13321313            emitGetVirtualRegister(src1, X86::eax, i);
    1333             JmpSrc isImmediate = emitJumpIfNotJSCell(X86::eax);
    1334 
    1335             __ movl_mr(FIELD_OFFSET(JSCell, m_structure), X86::eax, X86::ecx);
    1336             __ testl_i32m(MasqueradesAsUndefined, FIELD_OFFSET(Structure, m_typeInfo.m_flags), X86::ecx);
    1337             __ setz_r(X86::eax);
    1338 
    1339             JmpSrc wasNotImmediate = __ jmp();
    1340 
    1341             __ link(isImmediate, __ label());
    1342 
    1343             __ movl_i32r(~JSImmediate::ExtendedTagBitUndefined, X86::ecx);
    1344             __ andl_rr(X86::eax, X86::ecx);
    1345             __ cmpl_i32r(JSImmediate::FullTagTypeNull, X86::ecx);
    1346             __ setne_r(X86::eax);
    1347 
    1348             __ link(wasNotImmediate, __ label());
    1349 
    1350             __ movzbl_rr(X86::eax, X86::eax);
     1314            Jump isImmediate = emitJumpIfNotJSCell(X86::eax);
     1315
     1316            loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx);
     1317            setz32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), X86::eax);
     1318
     1319            Jump wasNotImmediate = jump();
     1320
     1321            isImmediate.link(this);
     1322
     1323            and32(Imm32(~JSImmediate::ExtendedTagBitUndefined), X86::eax);
     1324            setne32(Imm32(JSImmediate::FullTagTypeNull), X86::eax);
     1325
     1326            wasNotImmediate.link(this);
     1327
    13511328            emitTagAsBoolImmediate(X86::eax);
    13521329            emitPutVirtualRegister(dst);
Note: See TracChangeset for help on using the changeset viewer.