Changeset 89171 in webkit


Ignore:
Timestamp:
Jun 17, 2011 1:52:15 PM (13 years ago)
Author:
ggaren@apple.com
Message:

2011-06-17 Geoffrey Garen <ggaren@apple.com>

Reviewed by Oliver Hunt.

Moved some property access JIT code into property access JIT files
https://bugs.webkit.org/show_bug.cgi?id=62906

  • jit/JITOpcodes.cpp:
  • jit/JITOpcodes32_64.cpp:
  • jit/JITPropertyAccess.cpp: (JSC::JIT::emitSlow_op_put_by_val): (JSC::JIT::emit_op_get_scoped_var): (JSC::JIT::emit_op_put_scoped_var): (JSC::JIT::emit_op_get_global_var): (JSC::JIT::emit_op_put_global_var):
  • jit/JITPropertyAccess32_64.cpp: (JSC::JIT::emit_op_get_scoped_var): (JSC::JIT::emit_op_put_scoped_var): (JSC::JIT::emit_op_get_global_var): (JSC::JIT::emit_op_put_global_var):
Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r89160 r89171  
     12011-06-17  Geoffrey Garen  <ggaren@apple.com>
     2
     3        Reviewed by Oliver Hunt.
     4
     5        Moved some property access JIT code into property access JIT files
     6        https://bugs.webkit.org/show_bug.cgi?id=62906
     7
     8        * jit/JITOpcodes.cpp:
     9        * jit/JITOpcodes32_64.cpp:
     10        * jit/JITPropertyAccess.cpp:
     11        (JSC::JIT::emitSlow_op_put_by_val):
     12        (JSC::JIT::emit_op_get_scoped_var):
     13        (JSC::JIT::emit_op_put_scoped_var):
     14        (JSC::JIT::emit_op_get_global_var):
     15        (JSC::JIT::emit_op_put_global_var):
     16        * jit/JITPropertyAccess32_64.cpp:
     17        (JSC::JIT::emit_op_get_scoped_var):
     18        (JSC::JIT::emit_op_put_scoped_var):
     19        (JSC::JIT::emit_op_get_global_var):
     20        (JSC::JIT::emit_op_put_global_var):
     21
    1222011-06-17  Anders Carlsson  <andersca@apple.com>
    223
  • trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp

    r88962 r89171  
    435435}
    436436
    437 void JIT::emit_op_get_global_var(Instruction* currentInstruction)
    438 {
    439     JSVariableObject* globalObject = m_codeBlock->globalObject();
    440     loadPtr(&globalObject->m_registers, regT0);
    441     loadPtr(Address(regT0, currentInstruction[2].u.operand * sizeof(Register)), regT0);
    442     emitPutVirtualRegister(currentInstruction[1].u.operand);
    443 }
    444 
    445 void JIT::emit_op_put_global_var(Instruction* currentInstruction)
    446 {
    447     emitGetVirtualRegister(currentInstruction[2].u.operand, regT1);
    448     JSVariableObject* globalObject = m_codeBlock->globalObject();
    449     loadPtr(&globalObject->m_registers, regT0);
    450     storePtr(regT1, Address(regT0, currentInstruction[1].u.operand * sizeof(Register)));
    451 }
    452 
    453 void JIT::emit_op_get_scoped_var(Instruction* currentInstruction)
    454 {
    455     int skip = currentInstruction[3].u.operand;
    456 
    457     emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT0);
    458     bool checkTopLevel = m_codeBlock->codeType() == FunctionCode && m_codeBlock->needsFullScopeChain();
    459     ASSERT(skip || !checkTopLevel);
    460     if (checkTopLevel && skip--) {
    461         Jump activationNotCreated;
    462         if (checkTopLevel)
    463             activationNotCreated = branchTestPtr(Zero, addressFor(m_codeBlock->activationRegister()));
    464         loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, next)), regT0);
    465         activationNotCreated.link(this);
    466     }
    467     while (skip--)
    468         loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, next)), regT0);
    469 
    470     loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, object)), regT0);
    471     loadPtr(Address(regT0, OBJECT_OFFSETOF(JSVariableObject, m_registers)), regT0);
    472     loadPtr(Address(regT0, currentInstruction[2].u.operand * sizeof(Register)), regT0);
    473     emitPutVirtualRegister(currentInstruction[1].u.operand);
    474 }
    475 
    476 void JIT::emit_op_put_scoped_var(Instruction* currentInstruction)
    477 {
    478     int skip = currentInstruction[2].u.operand;
    479 
    480     emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT1);
    481     emitGetVirtualRegister(currentInstruction[3].u.operand, regT0);
    482     bool checkTopLevel = m_codeBlock->codeType() == FunctionCode && m_codeBlock->needsFullScopeChain();
    483     ASSERT(skip || !checkTopLevel);
    484     if (checkTopLevel && skip--) {
    485         Jump activationNotCreated;
    486         if (checkTopLevel)
    487             activationNotCreated = branchTestPtr(Zero, addressFor(m_codeBlock->activationRegister()));
    488         loadPtr(Address(regT1, OBJECT_OFFSETOF(ScopeChainNode, next)), regT1);
    489         activationNotCreated.link(this);
    490     }
    491     while (skip--)
    492         loadPtr(Address(regT1, OBJECT_OFFSETOF(ScopeChainNode, next)), regT1);
    493 
    494     loadPtr(Address(regT1, OBJECT_OFFSETOF(ScopeChainNode, object)), regT1);
    495     loadPtr(Address(regT1, OBJECT_OFFSETOF(JSVariableObject, m_registers)), regT1);
    496     storePtr(regT0, Address(regT1, currentInstruction[1].u.operand * sizeof(Register)));
    497 }
    498 
    499437void JIT::emit_op_tear_off_activation(Instruction* currentInstruction)
    500438{
     
    13281266}
    13291267
    1330 void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
    1331 {
    1332     unsigned base = currentInstruction[1].u.operand;
    1333     unsigned property = currentInstruction[2].u.operand;
    1334     unsigned value = currentInstruction[3].u.operand;
    1335 
    1336     linkSlowCase(iter); // property int32 check
    1337     linkSlowCaseIfNotJSCell(iter, base); // base cell check
    1338     linkSlowCase(iter); // base not array check
    1339     linkSlowCase(iter); // in vector check
    1340 
    1341     JITStubCall stubPutByValCall(this, cti_op_put_by_val);
    1342     stubPutByValCall.addArgument(regT0);
    1343     stubPutByValCall.addArgument(property, regT2);
    1344     stubPutByValCall.addArgument(value, regT2);
    1345     stubPutByValCall.call();
    1346 }
    1347 
    13481268void JIT::emitSlow_op_not(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
    13491269{
  • trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp

    r88962 r89171  
    626626}
    627627
    628 void JIT::emit_op_get_global_var(Instruction* currentInstruction)
    629 {
    630     int dst = currentInstruction[1].u.operand;
    631     JSGlobalObject* globalObject = m_codeBlock->globalObject();
    632     ASSERT(globalObject->isGlobalObject());
    633     int index = currentInstruction[2].u.operand;
    634 
    635     loadPtr(&globalObject->m_registers, regT2);
    636 
    637     emitLoad(index, regT1, regT0, regT2);
    638     emitStore(dst, regT1, regT0);
    639     map(m_bytecodeOffset + OPCODE_LENGTH(op_get_global_var), dst, regT1, regT0);
    640 }
    641 
    642 void JIT::emit_op_put_global_var(Instruction* currentInstruction)
    643 {
    644     JSGlobalObject* globalObject = m_codeBlock->globalObject();
    645     ASSERT(globalObject->isGlobalObject());
    646     int index = currentInstruction[1].u.operand;
    647     int value = currentInstruction[2].u.operand;
    648 
    649     emitLoad(value, regT1, regT0);
    650 
    651     loadPtr(&globalObject->m_registers, regT2);
    652     emitStore(index, regT1, regT0, regT2);
    653     map(m_bytecodeOffset + OPCODE_LENGTH(op_put_global_var), value, regT1, regT0);
    654 }
    655 
    656 void JIT::emit_op_get_scoped_var(Instruction* currentInstruction)
    657 {
    658     int dst = currentInstruction[1].u.operand;
    659     int index = currentInstruction[2].u.operand;
    660     int skip = currentInstruction[3].u.operand;
    661 
    662     emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT2);
    663     bool checkTopLevel = m_codeBlock->codeType() == FunctionCode && m_codeBlock->needsFullScopeChain();
    664     ASSERT(skip || !checkTopLevel);
    665     if (checkTopLevel && skip--) {
    666         Jump activationNotCreated;
    667         if (checkTopLevel)
    668             activationNotCreated = branch32(Equal, tagFor(m_codeBlock->activationRegister()), TrustedImm32(JSValue::EmptyValueTag));
    669         loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2);
    670         activationNotCreated.link(this);
    671     }
    672     while (skip--)
    673         loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2);
    674 
    675     loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, object)), regT2);
    676     loadPtr(Address(regT2, OBJECT_OFFSETOF(JSVariableObject, m_registers)), regT2);
    677 
    678     emitLoad(index, regT1, regT0, regT2);
    679     emitStore(dst, regT1, regT0);
    680     map(m_bytecodeOffset + OPCODE_LENGTH(op_get_scoped_var), dst, regT1, regT0);
    681 }
    682 
    683 void JIT::emit_op_put_scoped_var(Instruction* currentInstruction)
    684 {
    685     int index = currentInstruction[1].u.operand;
    686     int skip = currentInstruction[2].u.operand;
    687     int value = currentInstruction[3].u.operand;
    688 
    689     emitLoad(value, regT1, regT0);
    690 
    691     emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT2);
    692     bool checkTopLevel = m_codeBlock->codeType() == FunctionCode && m_codeBlock->needsFullScopeChain();
    693     ASSERT(skip || !checkTopLevel);
    694     if (checkTopLevel && skip--) {
    695         Jump activationNotCreated;
    696         if (checkTopLevel)
    697             activationNotCreated = branch32(Equal, tagFor(m_codeBlock->activationRegister()), TrustedImm32(JSValue::EmptyValueTag));
    698         loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2);
    699         activationNotCreated.link(this);
    700     }
    701     while (skip--)
    702         loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2);
    703 
    704     loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, object)), regT2);
    705     loadPtr(Address(regT2, OBJECT_OFFSETOF(JSVariableObject, m_registers)), regT2);
    706 
    707     emitStore(index, regT1, regT0, regT2);
    708     map(m_bytecodeOffset + OPCODE_LENGTH(op_put_scoped_var), value, regT1, regT0);
    709 }
    710 
    711628void JIT::emit_op_tear_off_activation(Instruction* currentInstruction)
    712629{
  • trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp

    r88604 r89171  
    221221}
    222222
     223void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
     224{
     225    unsigned base = currentInstruction[1].u.operand;
     226    unsigned property = currentInstruction[2].u.operand;
     227    unsigned value = currentInstruction[3].u.operand;
     228
     229    linkSlowCase(iter); // property int32 check
     230    linkSlowCaseIfNotJSCell(iter, base); // base cell check
     231    linkSlowCase(iter); // base not array check
     232    linkSlowCase(iter); // in vector check
     233
     234    JITStubCall stubPutByValCall(this, cti_op_put_by_val);
     235    stubPutByValCall.addArgument(regT0);
     236    stubPutByValCall.addArgument(property, regT2);
     237    stubPutByValCall.addArgument(value, regT2);
     238    stubPutByValCall.call();
     239}
     240
    223241void JIT::emit_op_put_by_index(Instruction* currentInstruction)
    224242{
     
    946964}
    947965
     966void JIT::emit_op_get_scoped_var(Instruction* currentInstruction)
     967{
     968    int skip = currentInstruction[3].u.operand;
     969
     970    emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT0);
     971    bool checkTopLevel = m_codeBlock->codeType() == FunctionCode && m_codeBlock->needsFullScopeChain();
     972    ASSERT(skip || !checkTopLevel);
     973    if (checkTopLevel && skip--) {
     974        Jump activationNotCreated;
     975        if (checkTopLevel)
     976            activationNotCreated = branchTestPtr(Zero, addressFor(m_codeBlock->activationRegister()));
     977        loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, next)), regT0);
     978        activationNotCreated.link(this);
     979    }
     980    while (skip--)
     981        loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, next)), regT0);
     982
     983    loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, object)), regT0);
     984    loadPtr(Address(regT0, OBJECT_OFFSETOF(JSVariableObject, m_registers)), regT0);
     985    loadPtr(Address(regT0, currentInstruction[2].u.operand * sizeof(Register)), regT0);
     986    emitPutVirtualRegister(currentInstruction[1].u.operand);
     987}
     988
     989void JIT::emit_op_put_scoped_var(Instruction* currentInstruction)
     990{
     991    int skip = currentInstruction[2].u.operand;
     992
     993    emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT1);
     994    emitGetVirtualRegister(currentInstruction[3].u.operand, regT0);
     995    bool checkTopLevel = m_codeBlock->codeType() == FunctionCode && m_codeBlock->needsFullScopeChain();
     996    ASSERT(skip || !checkTopLevel);
     997    if (checkTopLevel && skip--) {
     998        Jump activationNotCreated;
     999        if (checkTopLevel)
     1000            activationNotCreated = branchTestPtr(Zero, addressFor(m_codeBlock->activationRegister()));
     1001        loadPtr(Address(regT1, OBJECT_OFFSETOF(ScopeChainNode, next)), regT1);
     1002        activationNotCreated.link(this);
     1003    }
     1004    while (skip--)
     1005        loadPtr(Address(regT1, OBJECT_OFFSETOF(ScopeChainNode, next)), regT1);
     1006
     1007    loadPtr(Address(regT1, OBJECT_OFFSETOF(ScopeChainNode, object)), regT1);
     1008    loadPtr(Address(regT1, OBJECT_OFFSETOF(JSVariableObject, m_registers)), regT1);
     1009    storePtr(regT0, Address(regT1, currentInstruction[1].u.operand * sizeof(Register)));
     1010}
     1011
     1012void JIT::emit_op_get_global_var(Instruction* currentInstruction)
     1013{
     1014    JSVariableObject* globalObject = m_codeBlock->globalObject();
     1015    loadPtr(&globalObject->m_registers, regT0);
     1016    loadPtr(Address(regT0, currentInstruction[2].u.operand * sizeof(Register)), regT0);
     1017    emitPutVirtualRegister(currentInstruction[1].u.operand);
     1018}
     1019
     1020void JIT::emit_op_put_global_var(Instruction* currentInstruction)
     1021{
     1022    emitGetVirtualRegister(currentInstruction[2].u.operand, regT1);
     1023    JSVariableObject* globalObject = m_codeBlock->globalObject();
     1024    loadPtr(&globalObject->m_registers, regT0);
     1025    storePtr(regT1, Address(regT0, currentInstruction[1].u.operand * sizeof(Register)));
     1026}
     1027
    9481028#endif // USE(JSVALUE64)
    9491029
  • trunk/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp

    r88604 r89171  
    999999}
    10001000
     1001void JIT::emit_op_get_scoped_var(Instruction* currentInstruction)
     1002{
     1003    int dst = currentInstruction[1].u.operand;
     1004    int index = currentInstruction[2].u.operand;
     1005    int skip = currentInstruction[3].u.operand;
     1006
     1007    emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT2);
     1008    bool checkTopLevel = m_codeBlock->codeType() == FunctionCode && m_codeBlock->needsFullScopeChain();
     1009    ASSERT(skip || !checkTopLevel);
     1010    if (checkTopLevel && skip--) {
     1011        Jump activationNotCreated;
     1012        if (checkTopLevel)
     1013            activationNotCreated = branch32(Equal, tagFor(m_codeBlock->activationRegister()), TrustedImm32(JSValue::EmptyValueTag));
     1014        loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2);
     1015        activationNotCreated.link(this);
     1016    }
     1017    while (skip--)
     1018        loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2);
     1019
     1020    loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, object)), regT2);
     1021    loadPtr(Address(regT2, OBJECT_OFFSETOF(JSVariableObject, m_registers)), regT2);
     1022
     1023    emitLoad(index, regT1, regT0, regT2);
     1024    emitStore(dst, regT1, regT0);
     1025    map(m_bytecodeOffset + OPCODE_LENGTH(op_get_scoped_var), dst, regT1, regT0);
     1026}
     1027
     1028void JIT::emit_op_put_scoped_var(Instruction* currentInstruction)
     1029{
     1030    int index = currentInstruction[1].u.operand;
     1031    int skip = currentInstruction[2].u.operand;
     1032    int value = currentInstruction[3].u.operand;
     1033
     1034    emitLoad(value, regT1, regT0);
     1035
     1036    emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT2);
     1037    bool checkTopLevel = m_codeBlock->codeType() == FunctionCode && m_codeBlock->needsFullScopeChain();
     1038    ASSERT(skip || !checkTopLevel);
     1039    if (checkTopLevel && skip--) {
     1040        Jump activationNotCreated;
     1041        if (checkTopLevel)
     1042            activationNotCreated = branch32(Equal, tagFor(m_codeBlock->activationRegister()), TrustedImm32(JSValue::EmptyValueTag));
     1043        loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2);
     1044        activationNotCreated.link(this);
     1045    }
     1046    while (skip--)
     1047        loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2);
     1048
     1049    loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, object)), regT2);
     1050    loadPtr(Address(regT2, OBJECT_OFFSETOF(JSVariableObject, m_registers)), regT2);
     1051
     1052    emitStore(index, regT1, regT0, regT2);
     1053    map(m_bytecodeOffset + OPCODE_LENGTH(op_put_scoped_var), value, regT1, regT0);
     1054}
     1055
     1056void JIT::emit_op_get_global_var(Instruction* currentInstruction)
     1057{
     1058    int dst = currentInstruction[1].u.operand;
     1059    JSGlobalObject* globalObject = m_codeBlock->globalObject();
     1060    ASSERT(globalObject->isGlobalObject());
     1061    int index = currentInstruction[2].u.operand;
     1062
     1063    loadPtr(&globalObject->m_registers, regT2);
     1064
     1065    emitLoad(index, regT1, regT0, regT2);
     1066    emitStore(dst, regT1, regT0);
     1067    map(m_bytecodeOffset + OPCODE_LENGTH(op_get_global_var), dst, regT1, regT0);
     1068}
     1069
     1070void JIT::emit_op_put_global_var(Instruction* currentInstruction)
     1071{
     1072    JSGlobalObject* globalObject = m_codeBlock->globalObject();
     1073    ASSERT(globalObject->isGlobalObject());
     1074    int index = currentInstruction[1].u.operand;
     1075    int value = currentInstruction[2].u.operand;
     1076
     1077    emitLoad(value, regT1, regT0);
     1078
     1079    loadPtr(&globalObject->m_registers, regT2);
     1080    emitStore(index, regT1, regT0, regT2);
     1081    map(m_bytecodeOffset + OPCODE_LENGTH(op_put_global_var), value, regT1, regT0);
     1082}
     1083
    10011084} // namespace JSC
    10021085
Note: See TracChangeset for help on using the changeset viewer.