Changeset 89171 in webkit
- Timestamp:
- Jun 17, 2011 1:52:15 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r89160 r89171 1 2011-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 1 22 2011-06-17 Anders Carlsson <andersca@apple.com> 2 23 -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r88962 r89171 435 435 } 436 436 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 499 437 void JIT::emit_op_tear_off_activation(Instruction* currentInstruction) 500 438 { … … 1328 1266 } 1329 1267 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 check1337 linkSlowCaseIfNotJSCell(iter, base); // base cell check1338 linkSlowCase(iter); // base not array check1339 linkSlowCase(iter); // in vector check1340 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 1348 1268 void JIT::emitSlow_op_not(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) 1349 1269 { -
trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
r88962 r89171 626 626 } 627 627 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 711 628 void JIT::emit_op_tear_off_activation(Instruction* currentInstruction) 712 629 { -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r88604 r89171 221 221 } 222 222 223 void 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 223 241 void JIT::emit_op_put_by_index(Instruction* currentInstruction) 224 242 { … … 946 964 } 947 965 966 void 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 989 void 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 1012 void 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 1020 void 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 948 1028 #endif // USE(JSVALUE64) 949 1029 -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp
r88604 r89171 999 999 } 1000 1000 1001 void 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 1028 void 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 1056 void 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 1070 void 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 1001 1084 } // namespace JSC 1002 1085
Note: See TracChangeset
for help on using the changeset viewer.