Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (223823 => 223824)
--- trunk/Source/_javascript_Core/ChangeLog 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/ChangeLog 2017-10-22 18:28:16 UTC (rev 223824)
@@ -1,5 +1,103 @@
2017-10-22 Yusuke Suzuki <[email protected]>
+ [JSC][Baseline] Use linkAllSlowCasesForBytecodeOffset as much as possible to simplify slow cases handling
+ https://bugs.webkit.org/show_bug.cgi?id=178647
+
+ Reviewed by Saam Barati.
+
+ There is much code counting slow cases in fast paths to call `linkSlowCase` carefully. This is really error-prone
+ since the number of slow cases depends on values of instruction's metadata. We have linkAllSlowCasesForBytecodeOffset,
+ which drains all slow cases for a specified bytecode offset. In typical cases like just calling a slow path function,
+ this is enough. We use linkAllSlowCasesForBytecodeOffset as much as possible. It significantly simplifies the code.
+
+ * jit/JIT.h:
+ (JSC::JIT::linkAllSlowCases):
+ * jit/JITArithmetic.cpp:
+ (JSC::JIT::emitSlow_op_unsigned):
+ (JSC::JIT::emit_compareAndJump):
+ (JSC::JIT::emit_compareAndJumpSlow):
+ (JSC::JIT::emitSlow_op_inc):
+ (JSC::JIT::emitSlow_op_dec):
+ (JSC::JIT::emitSlow_op_mod):
+ (JSC::JIT::emitSlow_op_negate):
+ (JSC::JIT::emitSlow_op_bitand):
+ (JSC::JIT::emitSlow_op_bitor):
+ (JSC::JIT::emitSlow_op_bitxor):
+ (JSC::JIT::emitSlow_op_lshift):
+ (JSC::JIT::emitSlow_op_rshift):
+ (JSC::JIT::emitSlow_op_urshift):
+ (JSC::JIT::emitSlow_op_add):
+ (JSC::JIT::emitSlow_op_div):
+ (JSC::JIT::emitSlow_op_mul):
+ (JSC::JIT::emitSlow_op_sub):
+ * jit/JITArithmetic32_64.cpp:
+ (JSC::JIT::emit_compareAndJumpSlow):
+ (JSC::JIT::emitSlow_op_unsigned):
+ (JSC::JIT::emitSlow_op_inc):
+ (JSC::JIT::emitSlow_op_dec):
+ (JSC::JIT::emitSlow_op_mod):
+ * jit/JITCall.cpp:
+ (JSC::JIT::compileCallEvalSlowCase):
+ (JSC::JIT::compileOpCallSlowCase):
+ * jit/JITCall32_64.cpp:
+ (JSC::JIT::compileCallEvalSlowCase):
+ (JSC::JIT::compileOpCallSlowCase):
+ * jit/JITInlines.h:
+ (JSC::JIT::linkAllSlowCasesForBytecodeOffset):
+ * jit/JITOpcodes.cpp:
+ (JSC::JIT::emitSlow_op_new_object):
+ (JSC::JIT::emitSlow_op_create_this):
+ (JSC::JIT::emitSlow_op_check_tdz):
+ (JSC::JIT::emitSlow_op_to_this):
+ (JSC::JIT::emitSlow_op_to_primitive):
+ (JSC::JIT::emitSlow_op_not):
+ (JSC::JIT::emitSlow_op_eq):
+ (JSC::JIT::emitSlow_op_neq):
+ (JSC::JIT::emitSlow_op_stricteq):
+ (JSC::JIT::emitSlow_op_nstricteq):
+ (JSC::JIT::emitSlow_op_instanceof):
+ (JSC::JIT::emitSlow_op_instanceof_custom):
+ (JSC::JIT::emitSlow_op_to_number):
+ (JSC::JIT::emitSlow_op_to_string):
+ (JSC::JIT::emitSlow_op_loop_hint):
+ (JSC::JIT::emitSlow_op_check_traps):
+ (JSC::JIT::emitSlow_op_has_indexed_property):
+ (JSC::JIT::emitSlow_op_get_direct_pname):
+ (JSC::JIT::emitSlow_op_has_structure_property):
+ * jit/JITOpcodes32_64.cpp:
+ (JSC::JIT::emitSlow_op_new_object):
+ (JSC::JIT::emitSlow_op_instanceof):
+ (JSC::JIT::emitSlow_op_instanceof_custom):
+ (JSC::JIT::emitSlow_op_to_primitive):
+ (JSC::JIT::emitSlow_op_not):
+ (JSC::JIT::emitSlow_op_stricteq):
+ (JSC::JIT::emitSlow_op_nstricteq):
+ (JSC::JIT::emitSlow_op_to_number):
+ (JSC::JIT::emitSlow_op_to_string):
+ (JSC::JIT::emitSlow_op_create_this):
+ (JSC::JIT::emitSlow_op_to_this):
+ (JSC::JIT::emitSlow_op_check_tdz):
+ (JSC::JIT::emitSlow_op_has_indexed_property):
+ (JSC::JIT::emitSlow_op_get_direct_pname):
+ * jit/JITPropertyAccess.cpp:
+ (JSC::JIT::emitSlow_op_try_get_by_id):
+ (JSC::JIT::emitSlow_op_get_by_id):
+ (JSC::JIT::emitSlow_op_get_by_id_with_this):
+ (JSC::JIT::emitSlow_op_put_by_id):
+ (JSC::JIT::emitSlow_op_resolve_scope):
+ (JSC::JIT::emitSlow_op_get_from_scope):
+ (JSC::JIT::emitSlow_op_put_to_scope):
+ * jit/JITPropertyAccess32_64.cpp:
+ (JSC::JIT::emitSlow_op_try_get_by_id):
+ (JSC::JIT::emitSlow_op_get_by_id):
+ (JSC::JIT::emitSlow_op_get_by_id_with_this):
+ (JSC::JIT::emitSlow_op_put_by_id):
+ (JSC::JIT::emitSlow_op_resolve_scope):
+ (JSC::JIT::emitSlow_op_get_from_scope):
+ (JSC::JIT::emitSlow_op_put_to_scope):
+
+2017-10-22 Yusuke Suzuki <[email protected]>
+
[JSC] Clean up baseline slow path
https://bugs.webkit.org/show_bug.cgi?id=178646
Modified: trunk/Source/_javascript_Core/jit/JIT.h (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JIT.h 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JIT.h 2017-10-22 18:28:16 UTC (rev 223824)
@@ -716,6 +716,11 @@
void linkAllSlowCasesForBytecodeOffset(Vector<SlowCaseEntry>& slowCases,
Vector<SlowCaseEntry>::iterator&, unsigned bytecodeOffset);
+ void linkAllSlowCases(Vector<SlowCaseEntry>::iterator& iter)
+ {
+ linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ }
+
MacroAssembler::Call appendCallWithExceptionCheck(const FunctionPtr&);
#if OS(WINDOWS) && CPU(X86_64)
MacroAssembler::Call appendCallWithExceptionCheckAndSlowPathReturnType(const FunctionPtr&);
Modified: trunk/Source/_javascript_Core/jit/JITArithmetic.cpp (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITArithmetic.cpp 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITArithmetic.cpp 2017-10-22 18:28:16 UTC (rev 223824)
@@ -247,8 +247,7 @@
void JIT::emitSlow_op_unsigned(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_unsigned);
slowPathCall.call();
@@ -284,18 +283,21 @@
emitJumpSlowCaseIfNotInt(regT0);
int32_t op2imm = getOperandConstantInt(op2);
addJump(branch32(condition, regT0, Imm32(op2imm)), target);
- } else if (isOperandConstantInt(op1)) {
+ return;
+ }
+ if (isOperandConstantInt(op1)) {
emitGetVirtualRegister(op2, regT1);
emitJumpSlowCaseIfNotInt(regT1);
int32_t op1imm = getOperandConstantInt(op1);
addJump(branch32(commute(condition), regT1, Imm32(op1imm)), target);
- } else {
- emitGetVirtualRegisters(op1, regT0, op2, regT1);
- emitJumpSlowCaseIfNotInt(regT0);
- emitJumpSlowCaseIfNotInt(regT1);
+ return;
+ }
- addJump(branch32(condition, regT0, regT1), target);
- }
+ emitGetVirtualRegisters(op1, regT0, op2, regT1);
+ emitJumpSlowCaseIfNotInt(regT0);
+ emitJumpSlowCaseIfNotInt(regT1);
+
+ addJump(branch32(condition, regT0, regT1), target);
}
void JIT::emit_compareUnsignedAndJump(int op1, int op2, unsigned target, RelationalCondition condition)
@@ -347,10 +349,7 @@
// - constant int immediate to floating-point number
// - floating-point number to floating-point number.
if (isOperandConstantChar(op1) || isOperandConstantChar(op2)) {
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
emitGetVirtualRegister(op1, argumentGPR0);
emitGetVirtualRegister(op2, argumentGPR1);
@@ -360,7 +359,7 @@
}
if (isOperandConstantInt(op2)) {
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
if (supportsFloatingPoint()) {
Jump fail1 = emitJumpIfNotNumber(regT0);
@@ -382,9 +381,12 @@
emitGetVirtualRegister(op2, regT1);
callOperation(operation, regT0, regT1);
emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target);
- } else if (isOperandConstantInt(op1)) {
- linkSlowCase(iter);
+ return;
+ }
+ if (isOperandConstantInt(op1)) {
+ linkAllSlowCases(iter);
+
if (supportsFloatingPoint()) {
Jump fail1 = emitJumpIfNotNumber(regT1);
add64(tagTypeNumberRegister, regT1);
@@ -405,31 +407,32 @@
emitGetVirtualRegister(op1, regT2);
callOperation(operation, regT2, regT1);
emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target);
- } else {
- linkSlowCase(iter);
+ return;
+ }
- if (supportsFloatingPoint()) {
- Jump fail1 = emitJumpIfNotNumber(regT0);
- Jump fail2 = emitJumpIfNotNumber(regT1);
- Jump fail3 = emitJumpIfInt(regT1);
- add64(tagTypeNumberRegister, regT0);
- add64(tagTypeNumberRegister, regT1);
- move64ToDouble(regT0, fpRegT0);
- move64ToDouble(regT1, fpRegT1);
+ linkSlowCase(iter); // LHS is not Int.
- emitJumpSlowToHot(branchDouble(condition, fpRegT0, fpRegT1), target);
+ if (supportsFloatingPoint()) {
+ Jump fail1 = emitJumpIfNotNumber(regT0);
+ Jump fail2 = emitJumpIfNotNumber(regT1);
+ Jump fail3 = emitJumpIfInt(regT1);
+ add64(tagTypeNumberRegister, regT0);
+ add64(tagTypeNumberRegister, regT1);
+ move64ToDouble(regT0, fpRegT0);
+ move64ToDouble(regT1, fpRegT1);
- emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jless));
+ emitJumpSlowToHot(branchDouble(condition, fpRegT0, fpRegT1), target);
- fail1.link(this);
- fail2.link(this);
- fail3.link(this);
- }
+ emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jless));
- linkSlowCase(iter);
- callOperation(operation, regT0, regT1);
- emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target);
+ fail1.link(this);
+ fail2.link(this);
+ fail3.link(this);
}
+
+ linkSlowCase(iter); // RHS is not Int.
+ callOperation(operation, regT0, regT1);
+ emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target);
}
void JIT::emit_op_inc(Instruction* currentInstruction)
@@ -445,8 +448,8 @@
void JIT::emitSlow_op_inc(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_inc);
slowPathCall.call();
}
@@ -464,8 +467,8 @@
void JIT::emitSlow_op_dec(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_dec);
slowPathCall.call();
}
@@ -507,11 +510,8 @@
void JIT::emitSlow_op_mod(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_mod);
slowPathCall.call();
}
@@ -545,7 +545,7 @@
void JIT::emitSlow_op_negate(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITNegIC* negIC = bitwise_cast<JITNegIC*>(m_instructionToMathIC.get(currentInstruction));
emitMathICSlow(negIC, currentInstruction, operationArithNegateProfiledOptimize, operationArithNegateProfiled, operationArithNegateOptimize);
@@ -603,7 +603,7 @@
void JIT::emitSlow_op_bitand(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_bitand);
slowPathCall.call();
@@ -616,7 +616,7 @@
void JIT::emitSlow_op_bitor(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_bitor);
slowPathCall.call();
@@ -629,7 +629,7 @@
void JIT::emitSlow_op_bitxor(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_bitxor);
slowPathCall.call();
@@ -642,7 +642,7 @@
void JIT::emitSlow_op_lshift(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_lshift);
slowPathCall.call();
@@ -707,7 +707,7 @@
void JIT::emitSlow_op_rshift(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_rshift);
slowPathCall.call();
@@ -720,7 +720,7 @@
void JIT::emitSlow_op_urshift(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_urshift);
slowPathCall.call();
@@ -741,7 +741,7 @@
void JIT::emitSlow_op_add(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITAddIC* addIC = bitwise_cast<JITAddIC*>(m_instructionToMathIC.get(currentInstruction));
emitMathICSlow(addIC, currentInstruction, operationValueAddProfiledOptimize, operationValueAddProfiled, operationValueAddOptimize);
@@ -1048,7 +1048,7 @@
void JIT::emitSlow_op_div(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_div);
slowPathCall.call();
@@ -1064,7 +1064,7 @@
void JIT::emitSlow_op_mul(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
JITMulIC* mulIC = bitwise_cast<JITMulIC*>(m_instructionToMathIC.get(currentInstruction));
emitMathICSlow(mulIC, currentInstruction, operationValueMulProfiledOptimize, operationValueMulProfiled, operationValueMulOptimize);
@@ -1080,7 +1080,8 @@
void JIT::emitSlow_op_sub(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkAllSlowCasesForBytecodeOffset(m_slowCases, iter, m_bytecodeOffset);
+ linkAllSlowCases(iter);
+
JITSubIC* subIC = bitwise_cast<JITSubIC*>(m_instructionToMathIC.get(currentInstruction));
emitMathICSlow(subIC, currentInstruction, operationValueSubProfiledOptimize, operationValueSubProfiled, operationValueSubOptimize);
}
Modified: trunk/Source/_javascript_Core/jit/JITArithmetic32_64.cpp (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITArithmetic32_64.cpp 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITArithmetic32_64.cpp 2017-10-22 18:28:16 UTC (rev 223824)
@@ -124,25 +124,8 @@
void JIT::emit_compareAndJumpSlow(int op1, int op2, unsigned target, DoubleCondition, size_t (JIT_OPERATION *operation)(ExecState*, EncodedJSValue, EncodedJSValue), bool invert, Vector<SlowCaseEntry>::iterator& iter)
{
- if (isOperandConstantChar(op1) || isOperandConstantChar(op2)) {
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- } else {
- if (!supportsFloatingPoint()) {
- if (!isOperandConstantInt(op1) && !isOperandConstantInt(op2))
- linkSlowCase(iter); // int32 check
- linkSlowCase(iter); // int32 check
- } else {
- if (!isOperandConstantInt(op1)) {
- linkSlowCase(iter); // double check
- linkSlowCase(iter); // int32 check
- }
- if (isOperandConstantInt(op1) || !isOperandConstantInt(op2))
- linkSlowCase(iter); // double check
- }
- }
+ linkAllSlowCases(iter);
+
emitLoad(op1, regT1, regT0);
emitLoad(op2, regT3, regT2);
callOperation(operation, regT1, regT0, regT3, regT2);
@@ -163,8 +146,7 @@
void JIT::emitSlow_op_unsigned(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_unsigned);
slowPathCall.call();
@@ -183,8 +165,7 @@
void JIT::emitSlow_op_inc(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter); // int32 check
- linkSlowCase(iter); // overflow check
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_inc);
slowPathCall.call();
@@ -203,8 +184,7 @@
void JIT::emitSlow_op_dec(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter); // int32 check
- linkSlowCase(iter); // overflow check
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_dec);
slowPathCall.call();
@@ -380,11 +360,8 @@
void JIT::emitSlow_op_mod(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
#if CPU(X86)
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_mod);
slowPathCall.call();
#else
Modified: trunk/Source/_javascript_Core/jit/JITCall.cpp (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITCall.cpp 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITCall.cpp 2017-10-22 18:28:16 UTC (rev 223824)
@@ -112,10 +112,11 @@
void JIT::compileCallEvalSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
CallLinkInfo* info = m_codeBlock->addCallLinkInfo();
info->setUpCall(CallLinkInfo::Call, CodeOrigin(m_bytecodeOffset), regT0);
- linkSlowCase(iter);
int registerOffset = -instruction[4].u.operand;
addPtr(TrustedImm32(registerOffset * sizeof(Register) + sizeof(CallerFrameAndPC)), callFrameRegister, stackPointerRegister);
@@ -242,7 +243,7 @@
return;
}
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
if (opcodeID == op_tail_call || opcodeID == op_tail_call_varargs || opcodeID == op_tail_call_forward_arguments)
emitRestoreCalleeSaves();
Modified: trunk/Source/_javascript_Core/jit/JITCall32_64.cpp (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITCall32_64.cpp 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITCall32_64.cpp 2017-10-22 18:28:16 UTC (rev 223824)
@@ -202,11 +202,11 @@
void JIT::compileCallEvalSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
CallLinkInfo* info = m_codeBlock->addCallLinkInfo();
info->setUpCall(CallLinkInfo::Call, CodeOrigin(m_bytecodeOffset), regT0);
- linkSlowCase(iter);
-
int registerOffset = -instruction[4].u.operand;
int callee = instruction[2].u.operand;
@@ -315,8 +315,7 @@
return;
}
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
move(TrustedImmPtr(m_callCompilationInfo[callLinkInfoIndex].callLinkInfo), regT2);
Modified: trunk/Source/_javascript_Core/jit/JITInlines.h (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITInlines.h 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITInlines.h 2017-10-22 18:28:16 UTC (rev 223824)
@@ -864,10 +864,8 @@
ALWAYS_INLINE void JIT::linkAllSlowCasesForBytecodeOffset(Vector<SlowCaseEntry>& slowCases, Vector<SlowCaseEntry>::iterator& iter, unsigned bytecodeOffset)
{
- while (iter != slowCases.end() && iter->to == bytecodeOffset) {
- iter->from.link(this);
- ++iter;
- }
+ while (iter != slowCases.end() && iter->to == bytecodeOffset)
+ linkSlowCase(iter);
}
ALWAYS_INLINE void JIT::addSlowCase(Jump jump)
Modified: trunk/Source/_javascript_Core/jit/JITOpcodes.cpp (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITOpcodes.cpp 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes.cpp 2017-10-22 18:28:16 UTC (rev 223824)
@@ -98,8 +98,8 @@
void JIT::emitSlow_op_new_object(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
int dst = currentInstruction[1].u.operand;
Structure* structure = currentInstruction[3].u.objectAllocationProfile->structure();
callOperation(operationNewObject, structure);
@@ -770,12 +770,7 @@
void JIT::emitSlow_op_create_this(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter); // Callee::m_type != JSFunctionType.
- linkSlowCase(iter); // doesn't have rare data
- linkSlowCase(iter); // doesn't have an allocation profile
- linkSlowCase(iter); // allocation failed (no allocator)
- linkSlowCase(iter); // allocation failed (allocator empty)
- linkSlowCase(iter); // cached function didn't match
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_create_this);
slowPathCall.call();
@@ -789,7 +784,8 @@
void JIT::emitSlow_op_check_tdz(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_throw_tdz_error);
slowPathCall.call();
}
@@ -799,10 +795,7 @@
void JIT::emitSlow_op_to_this(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_to_this);
slowPathCall.call();
@@ -810,7 +803,7 @@
void JIT::emitSlow_op_to_primitive(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_to_primitive);
slowPathCall.call();
@@ -818,7 +811,7 @@
void JIT::emitSlow_op_not(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_not);
slowPathCall.call();
@@ -826,7 +819,8 @@
void JIT::emitSlow_op_eq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
callOperation(operationCompareEq, regT0, regT1);
emitTagBool(returnValueGPR);
emitPutVirtualRegister(currentInstruction[1].u.operand, returnValueGPR);
@@ -834,7 +828,8 @@
void JIT::emitSlow_op_neq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
callOperation(operationCompareEq, regT0, regT1);
xor32(TrustedImm32(0x1), regT0);
emitTagBool(returnValueGPR);
@@ -843,9 +838,8 @@
void JIT::emitSlow_op_stricteq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_stricteq);
slowPathCall.call();
}
@@ -852,9 +846,8 @@
void JIT::emitSlow_op_nstricteq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_nstricteq);
slowPathCall.call();
}
@@ -861,15 +854,13 @@
void JIT::emitSlow_op_instanceof(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
auto& bytecode = *reinterpret_cast<OpInstanceof*>(currentInstruction);
int dst = bytecode.dst();
int value = bytecode.value();
int proto = bytecode.prototype();
- linkSlowCaseIfNotJSCell(iter, value);
- linkSlowCaseIfNotJSCell(iter, proto);
- linkSlowCase(iter);
- linkSlowCase(iter);
emitGetVirtualRegister(value, regT0);
emitGetVirtualRegister(proto, regT1);
callOperation(operationInstanceOf, dst, regT0, regT1);
@@ -877,6 +868,8 @@
void JIT::emitSlow_op_instanceof_custom(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
auto& bytecode = *reinterpret_cast<OpInstanceofCustom*>(currentInstruction);
int dst = bytecode.dst();
int value = bytecode.value();
@@ -883,7 +876,6 @@
int constructor = bytecode.constructor();
int hasInstanceValue = bytecode.hasInstanceValue();
- linkSlowCase(iter);
emitGetVirtualRegister(value, regT0);
emitGetVirtualRegister(constructor, regT1);
emitGetVirtualRegister(hasInstanceValue, regT2);
@@ -894,7 +886,7 @@
void JIT::emitSlow_op_to_number(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_to_number);
slowPathCall.call();
@@ -902,8 +894,7 @@
void JIT::emitSlow_op_to_string(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter); // Not JSCell.
- linkSlowCase(iter); // Not JSString.
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_to_string);
slowPathCall.call();
@@ -925,7 +916,7 @@
#if ENABLE(DFG_JIT)
// Emit the slow path for the JIT optimization check:
if (canBeOptimized()) {
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
copyCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(vm()->topEntryFrame);
@@ -957,7 +948,8 @@
void JIT::emitSlow_op_check_traps(Instruction*, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
callOperation(operationHandleTraps);
}
@@ -1188,16 +1180,13 @@
void JIT::emitSlow_op_has_indexed_property(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int dst = currentInstruction[1].u.operand;
int base = currentInstruction[2].u.operand;
int property = currentInstruction[3].u.operand;
ByValInfo* byValInfo = m_byValCompilationInfo[m_byValInstructionIndex].byValInfo;
-
- linkSlowCaseIfNotJSCell(iter, base); // base cell check
- linkSlowCase(iter); // base array check
- linkSlowCase(iter); // vector length check
- linkSlowCase(iter); // empty value
-
+
Label slowPath = label();
emitGetVirtualRegister(base, regT0);
@@ -1251,9 +1240,7 @@
void JIT::emitSlow_op_get_direct_pname(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- int base = currentInstruction[2].u.operand;
- linkSlowCaseIfNotJSCell(iter, base);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_get_direct_pname);
slowPathCall.call();
@@ -1398,8 +1385,7 @@
void JIT::emitSlow_op_has_structure_property(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_has_structure_property);
slowPathCall.call();
Modified: trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp 2017-10-22 18:28:16 UTC (rev 223824)
@@ -97,8 +97,8 @@
void JIT::emitSlow_op_new_object(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
int dst = currentInstruction[1].u.operand;
Structure* structure = currentInstruction[3].u.objectAllocationProfile->structure();
callOperation(operationNewObject, structure);
@@ -188,16 +188,13 @@
void JIT::emitSlow_op_instanceof(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
auto& bytecode = *reinterpret_cast<OpInstanceof*>(currentInstruction);
int dst = bytecode.dst();
int value = bytecode.value();
int proto = bytecode.prototype();
- linkSlowCaseIfNotJSCell(iter, value);
- linkSlowCaseIfNotJSCell(iter, proto);
- linkSlowCase(iter);
- linkSlowCase(iter);
-
emitLoad(value, regT1, regT0);
emitLoad(proto, regT3, regT2);
callOperation(operationInstanceOf, dst, regT1, regT0, regT3, regT2);
@@ -205,6 +202,8 @@
void JIT::emitSlow_op_instanceof_custom(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
auto& bytecode = *reinterpret_cast<OpInstanceofCustom*>(currentInstruction);
int dst = bytecode.dst();
int value = bytecode.value();
@@ -211,8 +210,6 @@
int constructor = bytecode.constructor();
int hasInstanceValue = bytecode.hasInstanceValue();
- linkSlowCase(iter);
-
emitLoad(value, regT1, regT0);
emitLoadPayload(constructor, regT2);
emitLoad(hasInstanceValue, regT4, regT3);
@@ -333,7 +330,7 @@
void JIT::emitSlow_op_to_primitive(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_to_primitive);
slowPathCall.call();
@@ -364,7 +361,7 @@
void JIT::emitSlow_op_not(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_not);
slowPathCall.call();
@@ -590,9 +587,7 @@
void JIT::emitSlow_op_stricteq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_stricteq);
slowPathCall.call();
@@ -605,9 +600,7 @@
void JIT::emitSlow_op_nstricteq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_nstricteq);
slowPathCall.call();
@@ -702,7 +695,7 @@
void JIT::emitSlow_op_to_number(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_to_number);
slowPathCall.call();
@@ -724,8 +717,7 @@
void JIT::emitSlow_op_to_string(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter); // Not JSCell.
- linkSlowCase(iter); // Not JSString.
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_to_string);
slowPathCall.call();
@@ -912,12 +904,7 @@
void JIT::emitSlow_op_create_this(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter); // Callee::m_type != JSFunctionType.
- linkSlowCase(iter); // doesn't have rare data
- linkSlowCase(iter); // doesn't have an allocation profile
- linkSlowCase(iter); // allocation failed (no allocator)
- linkSlowCase(iter); // allocation failed (allocator empty)
- linkSlowCase(iter); // cached function didn't match
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_create_this);
slowPathCall.call();
@@ -939,9 +926,8 @@
void JIT::emitSlow_op_to_this(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_to_this);
slowPathCall.call();
}
@@ -954,7 +940,8 @@
void JIT::emitSlow_op_check_tdz(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
+
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_throw_tdz_error);
slowPathCall.call();
}
@@ -1050,15 +1037,12 @@
void JIT::emitSlow_op_has_indexed_property(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int dst = currentInstruction[1].u.operand;
int base = currentInstruction[2].u.operand;
int property = currentInstruction[3].u.operand;
ByValInfo* byValInfo = m_byValCompilationInfo[m_byValInstructionIndex].byValInfo;
-
- linkSlowCaseIfNotJSCell(iter, base); // base cell check
- linkSlowCase(iter); // base array check
- linkSlowCase(iter); // vector length check
- linkSlowCase(iter); // empty value
Label slowPath = label();
@@ -1113,9 +1097,7 @@
void JIT::emitSlow_op_get_direct_pname(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- int base = currentInstruction[2].u.operand;
- linkSlowCaseIfNotJSCell(iter, base);
- linkSlowCase(iter);
+ linkAllSlowCases(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_get_direct_pname);
slowPathCall.call();
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2017-10-22 18:28:16 UTC (rev 223824)
@@ -589,13 +589,11 @@
void JIT::emitSlow_op_try_get_by_id(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int resultVReg = currentInstruction[1].u.operand;
- int baseVReg = currentInstruction[2].u.operand;
const Identifier* ident = &(m_codeBlock->identifier(currentInstruction[3].u.operand));
- linkSlowCaseIfNotJSCell(iter, baseVReg);
- linkSlowCase(iter);
-
JITGetByIdGenerator& gen = m_getByIds[m_getByIdIndex++];
Label coldPathBegin = label();
@@ -654,13 +652,11 @@
void JIT::emitSlow_op_get_by_id(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int resultVReg = currentInstruction[1].u.operand;
- int baseVReg = currentInstruction[2].u.operand;
const Identifier* ident = &(m_codeBlock->identifier(currentInstruction[3].u.operand));
- linkSlowCaseIfNotJSCell(iter, baseVReg);
- linkSlowCase(iter);
-
JITGetByIdGenerator& gen = m_getByIds[m_getByIdIndex++];
Label coldPathBegin = label();
@@ -672,15 +668,11 @@
void JIT::emitSlow_op_get_by_id_with_this(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int resultVReg = currentInstruction[1].u.operand;
- int baseVReg = currentInstruction[2].u.operand;
- int thisVReg = currentInstruction[3].u.operand;
const Identifier* ident = &(m_codeBlock->identifier(currentInstruction[4].u.operand));
- linkSlowCaseIfNotJSCell(iter, baseVReg);
- linkSlowCaseIfNotJSCell(iter, thisVReg);
- linkSlowCase(iter);
-
JITGetByIdWithThisGenerator& gen = m_getByIdsWithThis[m_getByIdWithThisIndex++];
Label coldPathBegin = label();
@@ -719,12 +711,10 @@
void JIT::emitSlow_op_put_by_id(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- int baseVReg = currentInstruction[1].u.operand;
+ linkAllSlowCases(iter);
+
const Identifier* ident = &(m_codeBlock->identifier(currentInstruction[2].u.operand));
- linkSlowCaseIfNotJSCell(iter, baseVReg);
- linkSlowCase(iter);
-
Label coldPathBegin(this);
JITPutByIdGenerator& gen = m_putByIds[m_putByIdIndex++];
@@ -830,16 +820,8 @@
void JIT::emitSlow_op_resolve_scope(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- ResolveType resolveType = static_cast<ResolveType>(copiedInstruction(currentInstruction)[4].u.operand);
- if (resolveType == GlobalProperty || resolveType == GlobalVar || resolveType == ClosureVar || resolveType == GlobalLexicalVar || resolveType == ModuleVar)
- return;
+ linkAllSlowCases(iter);
- if (resolveType == UnresolvedProperty || resolveType == UnresolvedPropertyWithVarInjectionChecks) {
- linkSlowCase(iter); // var injections check for GlobalPropertyWithVarInjectionChecks.
- linkSlowCase(iter); // var injections check for GlobalLexicalVarWithVarInjectionChecks.
- }
-
- linkSlowCase(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_resolve_scope);
slowPathCall.call();
}
@@ -969,31 +951,9 @@
void JIT::emitSlow_op_get_from_scope(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int dst = currentInstruction[1].u.operand;
- ResolveType resolveType = GetPutInfo(copiedInstruction(currentInstruction)[4].u.operand).resolveType();
-
- if (resolveType == GlobalVar || resolveType == ClosureVar)
- return;
-
- if (resolveType == GlobalProperty || resolveType == GlobalPropertyWithVarInjectionChecks)
- linkSlowCase(iter); // bad structure
-
- if (resolveType == GlobalLexicalVarWithVarInjectionChecks) // Var injections check.
- linkSlowCase(iter);
-
- if (resolveType == UnresolvedProperty || resolveType == UnresolvedPropertyWithVarInjectionChecks) {
- // GlobalProperty/GlobalPropertyWithVarInjectionChecks
- linkSlowCase(iter); // emitLoadWithStructureCheck
- linkSlowCase(iter); // emitLoadWithStructureCheck
- // GlobalLexicalVar
- linkSlowCase(iter); // TDZ check.
- // GlobalLexicalVarWithVarInjectionChecks.
- linkSlowCase(iter); // var injection check.
- linkSlowCase(iter); // TDZ check.
- }
-
- linkSlowCase(iter);
-
callOperation(WithProfile, operationGetFromScope, dst, currentInstruction);
}
@@ -1122,42 +1082,10 @@
void JIT::emitSlow_op_put_to_scope(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
GetPutInfo getPutInfo = GetPutInfo(copiedInstruction(currentInstruction)[4].u.operand);
ResolveType resolveType = getPutInfo.resolveType();
- unsigned linkCount = 0;
- if (resolveType != GlobalVar && resolveType != ClosureVar && resolveType != LocalClosureVar && resolveType != GlobalLexicalVar)
- linkCount++;
- if (resolveType == GlobalVar || resolveType == GlobalVarWithVarInjectionChecks
- || resolveType == GlobalLexicalVar || resolveType == GlobalLexicalVarWithVarInjectionChecks
- || resolveType == ClosureVar || resolveType == ClosureVarWithVarInjectionChecks
- || resolveType == LocalClosureVar)
- linkCount++;
- if (resolveType == GlobalProperty || resolveType == GlobalPropertyWithVarInjectionChecks)
- linkCount++; // bad structure
- if (!isInitialization(getPutInfo.initializationMode()) && (resolveType == GlobalLexicalVar || resolveType == GlobalLexicalVarWithVarInjectionChecks)) // TDZ check.
- linkCount++;
- if (resolveType == UnresolvedProperty || resolveType == UnresolvedPropertyWithVarInjectionChecks) {
- // GlobalProperty/GlobalPropertyWithVarInjectionsCheck
- linkCount++; // emitLoadWithStructureCheck
- linkCount++; // emitLoadWithStructureCheck
-
- // GlobalLexicalVar
- bool needsTDZCheck = !isInitialization(getPutInfo.initializationMode());
- if (needsTDZCheck)
- linkCount++;
- linkCount++; // Notify write check.
-
- // GlobalLexicalVarWithVarInjectionsCheck
- linkCount++; // var injection check.
- if (needsTDZCheck)
- linkCount++;
- linkCount++; // Notify write check.
- }
- if (!linkCount)
- return;
- while (linkCount--)
- linkSlowCase(iter);
-
if (resolveType == ModuleVar) {
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_throw_strict_mode_readonly_property_write_error);
slowPathCall.call();
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp (223823 => 223824)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp 2017-10-22 16:47:01 UTC (rev 223823)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp 2017-10-22 18:28:16 UTC (rev 223824)
@@ -605,13 +605,11 @@
void JIT::emitSlow_op_try_get_by_id(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int resultVReg = currentInstruction[1].u.operand;
- int baseVReg = currentInstruction[2].u.operand;
const Identifier* ident = &(m_codeBlock->identifier(currentInstruction[3].u.operand));
- linkSlowCaseIfNotJSCell(iter, baseVReg);
- linkSlowCase(iter);
-
JITGetByIdGenerator& gen = m_getByIds[m_getByIdIndex++];
Label coldPathBegin = label();
@@ -647,13 +645,11 @@
void JIT::emitSlow_op_get_by_id(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int resultVReg = currentInstruction[1].u.operand;
- int baseVReg = currentInstruction[2].u.operand;
const Identifier* ident = &(m_codeBlock->identifier(currentInstruction[3].u.operand));
- linkSlowCaseIfNotJSCell(iter, baseVReg);
- linkSlowCase(iter);
-
JITGetByIdGenerator& gen = m_getByIds[m_getByIdIndex++];
Label coldPathBegin = label();
@@ -688,15 +684,11 @@
void JIT::emitSlow_op_get_by_id_with_this(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int resultVReg = currentInstruction[1].u.operand;
- int baseVReg = currentInstruction[2].u.operand;
- int thisVReg = currentInstruction[3].u.operand;
const Identifier* ident = &(m_codeBlock->identifier(currentInstruction[4].u.operand));
- linkSlowCaseIfNotJSCell(iter, baseVReg);
- linkSlowCaseIfNotJSCell(iter, thisVReg);
- linkSlowCase(iter);
-
JITGetByIdWithThisGenerator& gen = m_getByIdsWithThis[m_getByIdWithThisIndex++];
Label coldPathBegin = label();
@@ -735,12 +727,11 @@
void JIT::emitSlow_op_put_by_id(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int base = currentInstruction[1].u.operand;
const Identifier* ident = &(m_codeBlock->identifier(currentInstruction[2].u.operand));
- linkSlowCaseIfNotJSCell(iter, base);
- linkSlowCase(iter);
-
Label coldPathBegin(this);
// JITPutByIdGenerator only preserve the value and the base's payload, we have to reload the tag.
@@ -850,16 +841,8 @@
void JIT::emitSlow_op_resolve_scope(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- ResolveType resolveType = static_cast<ResolveType>(currentInstruction[4].u.operand);
+ linkAllSlowCases(iter);
- if (resolveType == GlobalProperty || resolveType == GlobalVar || resolveType == ClosureVar || resolveType == GlobalLexicalVar || resolveType == ModuleVar)
- return;
- if (resolveType == UnresolvedProperty || resolveType == UnresolvedPropertyWithVarInjectionChecks) {
- linkSlowCase(iter); // Var injections check for GlobalPropertyWithVarInjectionChecks.
- linkSlowCase(iter); // Var injections check for GlobalLexicalVarWithVarInjectionChecks.
- }
-
- linkSlowCase(iter);
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_resolve_scope);
slowPathCall.call();
}
@@ -990,26 +973,9 @@
void JIT::emitSlow_op_get_from_scope(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
int dst = currentInstruction[1].u.operand;
- ResolveType resolveType = GetPutInfo(currentInstruction[4].u.operand).resolveType();
-
- if (resolveType == GlobalVar || resolveType == ClosureVar)
- return;
-
- if (resolveType == GlobalLexicalVarWithVarInjectionChecks) // Var Injections check.
- linkSlowCase(iter);
-
- if (resolveType == UnresolvedProperty || resolveType == UnresolvedPropertyWithVarInjectionChecks) {
- // GlobalProperty/GlobalPropertyWithVarInjectionChecks
- linkSlowCase(iter); // emitLoadWithStructureCheck
- // GlobalLexicalVar
- linkSlowCase(iter); // TDZ check.
- // GlobalLexicalVarWithVarInjectionChecks.
- linkSlowCase(iter); // var injection check.
- linkSlowCase(iter); // TDZ check.
- }
-
- linkSlowCase(iter);
callOperation(WithProfile, operationGetFromScope, dst, currentInstruction);
}
@@ -1142,39 +1108,10 @@
void JIT::emitSlow_op_put_to_scope(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
+ linkAllSlowCases(iter);
+
GetPutInfo getPutInfo = GetPutInfo(currentInstruction[4].u.operand);
ResolveType resolveType = getPutInfo.resolveType();
- unsigned linkCount = 0;
- if (resolveType != GlobalVar && resolveType != ClosureVar && resolveType != LocalClosureVar && resolveType != GlobalLexicalVar)
- linkCount++;
- if (resolveType == GlobalVar || resolveType == GlobalVarWithVarInjectionChecks
- || resolveType == GlobalLexicalVar || resolveType == GlobalLexicalVarWithVarInjectionChecks
- || resolveType == ClosureVar || resolveType == ClosureVarWithVarInjectionChecks
- || resolveType == LocalClosureVar)
- linkCount++;
- if (!isInitialization(getPutInfo.initializationMode()) && (resolveType == GlobalLexicalVar || resolveType == GlobalLexicalVarWithVarInjectionChecks)) // TDZ check.
- linkCount++;
- if (resolveType == UnresolvedProperty || resolveType == UnresolvedPropertyWithVarInjectionChecks) {
- // GlobalProperty/GlobalPropertyWithVarInjectionsCheck
- linkCount++; // emitLoadWithStructureCheck
-
- // GlobalLexicalVar
- bool needsTDZCheck = !isInitialization(getPutInfo.initializationMode());
- if (needsTDZCheck)
- linkCount++;
- linkCount++; // Notify write check.
-
- // GlobalLexicalVarWithVarInjectionsCheck
- linkCount++; // var injection check.
- if (needsTDZCheck)
- linkCount++;
- linkCount++; // Notify write check.
- }
- if (!linkCount)
- return;
- while (linkCount--)
- linkSlowCase(iter);
-
if (resolveType == ModuleVar) {
JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_throw_strict_mode_readonly_property_write_error);
slowPathCall.call();