https://bugs.webkit.org/show_bug.cgi?id=172383
<rdar://problem/
31418651>
Reviewed by Filip Pizlo.
JSTests:
* stress/regress-172383.js: Added.
Source/JavaScriptCore:
pickCanTrample() is wrongly assuming that one of regT0 and regT1 is always
available as a scratch register. This assumption is wrong if this canTrample
register is used for a silentFill() after an operation that returns a result in
regT0 or regT1.
Turns out the only reason we need the canTrample register is for
SetDoubleConstant. We can remove the need for this canTrample register by
introducing a moveDouble() pseudo instruction in the MacroAssembler to do the
job using the scratchRegister() on X86_64 or the dataMemoryTempRegister() on
ARM64. In so doing, we can simplify the silentFill() code and eliminate the bug.
* assembler/MacroAssembler.h:
(JSC::MacroAssembler::moveDouble):
* dfg/DFGArrayifySlowPathGenerator.h:
* dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
(JSC::DFG::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator):
* dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h:
* dfg/DFGSaneStringGetByValSlowPathGenerator.h:
* dfg/DFGSlowPathGenerator.h:
(JSC::DFG::CallSlowPathGenerator::tearDown):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::silentFill):
(JSC::DFG::SpeculativeJIT::compileToLowerCase):
(JSC::DFG::SpeculativeJIT::compileValueToInt32):
(JSC::DFG::SpeculativeJIT::compileInstanceOfForObject):
(JSC::DFG::SpeculativeJIT::emitUntypedBitOp):
(JSC::DFG::SpeculativeJIT::emitUntypedRightShiftBitOp):
(JSC::DFG::SpeculativeJIT::compileArithDiv):
(JSC::DFG::SpeculativeJIT::compileArraySlice):
(JSC::DFG::SpeculativeJIT::emitSwitchImm):
(JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
(JSC::DFG::SpeculativeJIT::compileStoreBarrier):
* dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::silentFill):
(JSC::DFG::SpeculativeJIT::silentSpillAllRegisters):
(JSC::DFG::SpeculativeJIT::silentFillAllRegisters):
(JSC::DFG::SpeculativeJIT::pickCanTrample): Deleted.
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
(JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
(JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
(JSC::DFG::SpeculativeJIT::emitCall):
(JSC::DFG::SpeculativeJIT::compile):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
(JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
(JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
(JSC::DFG::SpeculativeJIT::emitCall):
(JSC::DFG::SpeculativeJIT::compile):
(JSC::DFG::SpeculativeJIT::convertAnyInt):
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@217156
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2017-05-19 Mark Lam <mark.lam@apple.com>
+
+ DFG::SpeculativeJIT::pickCanTrample() is wrongly ignoring result registers.
+ https://bugs.webkit.org/show_bug.cgi?id=172383
+ <rdar://problem/31418651>
+
+ Reviewed by Filip Pizlo.
+
+ * stress/regress-172383.js: Added.
+
2017-05-19 Filip Pizlo <fpizlo@apple.com>
arrayProtoPrivateFuncConcatMemcpy needs to be down with firstArray being undecided
--- /dev/null
+// This test should not crash.
+
+let x = undefined;
+
+function foo(w, a0, a1) {
+ var r0 = x % a0;
+ var r1 = w ^ a1;
+
+ var r4 = 3 % 7;
+
+ var r6 = w ^ 0;
+ var r7 = r4 / r4;
+ var r9 = x - r7;
+ a1 = 0 + r0;
+
+ var r11 = 0 & a0;
+ var r12 = r4 * a1;
+ var r7 = r11 & a0;
+
+ var r15 = r11 | r4;
+ var r16 = 0 & r1;
+ var r20 = 5 * a0;
+
+ var r2 = 0 + r9;
+ var r26 = r11 | r15;
+ var r29 = r16 + 0;
+ var r29 = r28 * r1;
+ var r34 = w / r12;
+
+ var r28 = 0 / r7;
+ var r64 = r20 + 0;
+ var r65 = 0 + r6;
+
+ return a1;
+}
+noInline(foo);
+
+for (var i = 0; i < 1886; i++)
+ foo("q");
+
+2017-05-19 Mark Lam <mark.lam@apple.com>
+
+ DFG::SpeculativeJIT::pickCanTrample() is wrongly ignoring result registers.
+ https://bugs.webkit.org/show_bug.cgi?id=172383
+ <rdar://problem/31418651>
+
+ Reviewed by Filip Pizlo.
+
+ pickCanTrample() is wrongly assuming that one of regT0 and regT1 is always
+ available as a scratch register. This assumption is wrong if this canTrample
+ register is used for a silentFill() after an operation that returns a result in
+ regT0 or regT1.
+
+ Turns out the only reason we need the canTrample register is for
+ SetDoubleConstant. We can remove the need for this canTrample register by
+ introducing a moveDouble() pseudo instruction in the MacroAssembler to do the
+ job using the scratchRegister() on X86_64 or the dataMemoryTempRegister() on
+ ARM64. In so doing, we can simplify the silentFill() code and eliminate the bug.
+
+ * assembler/MacroAssembler.h:
+ (JSC::MacroAssembler::moveDouble):
+ * dfg/DFGArrayifySlowPathGenerator.h:
+ * dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
+ (JSC::DFG::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator):
+ * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h:
+ * dfg/DFGSaneStringGetByValSlowPathGenerator.h:
+ * dfg/DFGSlowPathGenerator.h:
+ (JSC::DFG::CallSlowPathGenerator::tearDown):
+ * dfg/DFGSpeculativeJIT.cpp:
+ (JSC::DFG::SpeculativeJIT::silentFill):
+ (JSC::DFG::SpeculativeJIT::compileToLowerCase):
+ (JSC::DFG::SpeculativeJIT::compileValueToInt32):
+ (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject):
+ (JSC::DFG::SpeculativeJIT::emitUntypedBitOp):
+ (JSC::DFG::SpeculativeJIT::emitUntypedRightShiftBitOp):
+ (JSC::DFG::SpeculativeJIT::compileArithDiv):
+ (JSC::DFG::SpeculativeJIT::compileArraySlice):
+ (JSC::DFG::SpeculativeJIT::emitSwitchImm):
+ (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
+ (JSC::DFG::SpeculativeJIT::compileStoreBarrier):
+ * dfg/DFGSpeculativeJIT.h:
+ (JSC::DFG::SpeculativeJIT::silentFill):
+ (JSC::DFG::SpeculativeJIT::silentSpillAllRegisters):
+ (JSC::DFG::SpeculativeJIT::silentFillAllRegisters):
+ (JSC::DFG::SpeculativeJIT::pickCanTrample): Deleted.
+ * dfg/DFGSpeculativeJIT32_64.cpp:
+ (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
+ (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
+ (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
+ (JSC::DFG::SpeculativeJIT::emitCall):
+ (JSC::DFG::SpeculativeJIT::compile):
+ * dfg/DFGSpeculativeJIT64.cpp:
+ (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
+ (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
+ (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
+ (JSC::DFG::SpeculativeJIT::emitCall):
+ (JSC::DFG::SpeculativeJIT::compile):
+ (JSC::DFG::SpeculativeJIT::convertAnyInt):
+
2017-05-19 Filip Pizlo <fpizlo@apple.com>
Deduplicate some code in arrayProtoPrivateFuncConcatMemcpy
move(imm.asTrustedImm64(), dest);
}
+#if CPU(X86_64)
+ void moveDouble(Imm64 imm, FPRegisterID dest)
+ {
+ move(imm, scratchRegister());
+ move64ToDouble(scratchRegister(), dest);
+ }
+#elif CPU(ARM64)
+ void moveDouble(Imm64 imm, FPRegisterID dest)
+ {
+ move(imm, dataMemoryTempRegister());
+ move64ToDouble(dataMemoryTempRegister(), dest);
+ }
+#endif
+
void and64(Imm32 imm, RegisterID dest)
{
if (shouldBlind(imm)) {
/*
- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
break;
}
for (unsigned i = m_plans.size(); i--;)
- jit->silentFill(m_plans[i], GPRInfo::regT0);
+ jit->silentFill(m_plans[i]);
jit->m_jit.exceptionCheck();
if (m_op == ArrayifyToStructure) {
/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
for (unsigned i = 0; i < m_plans.size(); ++i)
jit->silentSpill(m_plans[i]);
jit->callOperation(m_function, m_resultGPR, m_structure, m_size, m_storageGPR);
- GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
for (unsigned i = m_plans.size(); i--;)
- jit->silentFill(m_plans[i], canTrample);
+ jit->silentFill(m_plans[i]);
jit->m_jit.exceptionCheck();
jit->m_jit.loadPtr(MacroAssembler::Address(m_resultGPR, JSObject::butterflyOffset()), m_storageGPR);
jumpTo(jit);
} else
jit->m_jit.move(SpeculativeJIT::TrustedImmPtr(m_contiguousStructure), scratchGPR);
jit->callOperation(m_function, m_resultGPR, scratchGPR, m_sizeGPR, m_storageGPR);
- GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
for (unsigned i = m_plans.size(); i--;)
- jit->silentFill(m_plans[i], canTrample);
+ jit->silentFill(m_plans[i]);
jit->m_jit.exceptionCheck();
jumpTo(jit);
}
public:
CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator(
MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZB function,
- GPRReg resultGPR, GPRReg structureGPR, GPRReg sizeGPR, GPRReg storageGPR, GPRReg scratchGPR)
+ GPRReg resultGPR, GPRReg structureGPR, GPRReg sizeGPR, GPRReg storageGPR)
: JumpingSlowPathGenerator<MacroAssembler::JumpList>(from, jit)
, m_function(function)
, m_resultGPR(resultGPR)
, m_structureGPR(structureGPR)
, m_sizeGPR(sizeGPR)
, m_storageGPR(storageGPR)
- , m_scratchGPR(scratchGPR)
{
- jit->silentSpillAllRegistersImpl(false, m_plans, resultGPR, m_scratchGPR);
+ jit->silentSpillAllRegistersImpl(false, m_plans, resultGPR);
}
protected:
jit->silentSpill(m_plans[i]);
jit->callOperation(m_function, m_resultGPR, m_structureGPR, m_sizeGPR, m_storageGPR);
for (unsigned i = m_plans.size(); i--;)
- jit->silentFill(m_plans[i], m_scratchGPR);
+ jit->silentFill(m_plans[i]);
jit->m_jit.exceptionCheck();
jumpTo(jit);
}
GPRReg m_structureGPR;
GPRReg m_sizeGPR;
GPRReg m_storageGPR;
- GPRReg m_scratchGPR;
Vector<SilentRegisterSavePlan, 2> m_plans;
};
/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
jit->silentSpill(m_plans[i]);
jit->callOperation(
operationCreateDirectArguments, m_resultGPR, m_structure, m_lengthGPR, m_minCapacity);
- GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
for (unsigned i = m_plans.size(); i--;)
- jit->silentFill(m_plans[i], canTrample);
+ jit->silentFill(m_plans[i]);
jit->m_jit.exceptionCheck();
jit->m_jit.loadPtr(
MacroAssembler::Address(m_resultGPR, DirectArguments::offsetOfLength()), m_lengthGPR);
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
for (unsigned i = 0; i < m_plans.size(); ++i)
jit->silentSpill(m_plans[i]);
jit->callOperation(operationGetByValStringInt, extractResult(m_resultRegs), m_baseReg, m_propertyReg);
- GPRReg canTrample = SpeculativeJIT::pickCanTrample(extractResult(m_resultRegs));
for (unsigned i = m_plans.size(); i--;)
- jit->silentFill(m_plans[i], canTrample);
+ jit->silentFill(m_plans[i]);
jit->m_jit.exceptionCheck();
jumpTo(jit);
/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
void tearDown(SpeculativeJIT* jit)
{
if (m_spillMode == NeedToSpill) {
- GPRReg canTrample = SpeculativeJIT::pickCanTrample(extractResult(m_result));
for (unsigned i = m_plans.size(); i--;)
- jit->silentFill(m_plans[i], canTrample);
+ jit->silentFill(m_plans[i]);
}
if (m_exceptionCheckRequirement == ExceptionCheckRequirement::CheckNeeded)
jit->m_jit.exceptionCheck();
}
}
-void SpeculativeJIT::silentFill(const SilentRegisterSavePlan& plan, GPRReg canTrample)
+void SpeculativeJIT::silentFill(const SilentRegisterSavePlan& plan)
{
-#if USE(JSVALUE32_64)
- UNUSED_PARAM(canTrample);
-#endif
switch (plan.fillAction()) {
case DoNothingForFill:
break;
m_jit.move(valueOfJSConstantAsImm64(plan.node()), plan.gpr());
break;
case SetDoubleConstant:
- m_jit.move(Imm64(reinterpretDoubleToInt64(plan.node()->asNumber())), canTrample);
- m_jit.move64ToDouble(canTrample, plan.fpr());
+ m_jit.moveDouble(Imm64(reinterpretDoubleToInt64(plan.node()->asNumber())), plan.fpr());
break;
case Load32PayloadBoxInt:
m_jit.load32(JITCompiler::payloadFor(plan.node()->virtualRegister()), plan.gpr());
slowPath.link(&m_jit);
silentSpillAllRegisters(lengthGPR);
callOperation(operationToLowerCase, lengthGPR, stringGPR, indexGPR);
- silentFillAllRegisters(lengthGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
auto done = m_jit.jump();
silentSpillAllRegisters(resultGpr);
callOperation(operationToInt32, resultGpr, fpr);
- silentFillAllRegisters(resultGpr);
+ silentFillAllRegisters();
converted.append(m_jit.jump());
silentSpillAllRegisters(resultGpr);
callOperation(operationToInt32, resultGpr, fpr);
- silentFillAllRegisters(resultGpr);
+ silentFillAllRegisters();
converted.append(m_jit.jump());
performDefaultHasInstance.link(&m_jit);
silentSpillAllRegisters(scratchReg);
callOperation(operationDefaultHasInstance, scratchReg, valueReg, prototypeReg);
- silentFillAllRegisters(scratchReg);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
#if USE(JSVALUE64)
m_jit.or32(TrustedImm32(ValueFalse), scratchReg);
callOperation(snippetSlowPathFunction, resultRegs, leftRegs, rightRegs);
- silentFillAllRegisters(resultRegs);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
gen.endJumpList().link(&m_jit);
callOperation(snippetSlowPathFunction, resultRegs, leftRegs, rightRegs);
- silentFillAllRegisters(resultRegs);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
gen.endJumpList().link(&m_jit);
callOperation(operationValueDiv, resultRegs, leftRegs, rightRegs);
- silentFillAllRegisters(resultRegs);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
gen.endJumpList().link(&m_jit);
m_jit.mutatorFence(*m_jit.vm());
addSlowPathGenerator(std::make_unique<CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator>(
- slowCases, this, operationNewArrayWithSize, resultGPR, tempValue, sizeGPR, storageResultGPR, scratchGPR));
+ slowCases, this, operationNewArrayWithSize, resultGPR, tempValue, sizeGPR, storageResultGPR));
}
}
data->fallThrough.block);
silentSpillAllRegisters(scratch);
callOperation(operationFindSwitchImmTargetForDouble, scratch, valueRegs.gpr(), data->switchTableIndex);
- silentFillAllRegisters(scratch);
+ silentFillAllRegisters();
m_jit.jump(scratch);
#else
JITCompiler::Jump notInt = m_jit.branch32(
data->fallThrough.block);
silentSpillAllRegisters(scratch);
callOperation(operationFindSwitchImmTargetForDouble, scratch, valueRegs, data->switchTableIndex);
- silentFillAllRegisters(scratch);
+ silentFillAllRegisters();
m_jit.jump(scratch);
#endif
slowCases.link(&m_jit);
silentSpillAllRegisters(string);
callOperation(operationSwitchString, string, data->switchTableIndex, string);
- silentFillAllRegisters(string);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
m_jit.jump(string);
}
silentSpillAllRegisters(InvalidGPRReg);
callOperation(operationWriteBarrierSlowPath, baseGPR);
- silentFillAllRegisters(InvalidGPRReg);
+ silentFillAllRegisters();
ok.link(&m_jit);
/*
- * Copyright (C) 2011-2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
SilentRegisterSavePlan silentSavePlanForGPR(VirtualRegister spillMe, GPRReg source);
SilentRegisterSavePlan silentSavePlanForFPR(VirtualRegister spillMe, FPRReg source);
void silentSpill(const SilentRegisterSavePlan&);
- void silentFill(const SilentRegisterSavePlan&, GPRReg canTrample);
+ void silentFill(const SilentRegisterSavePlan&);
template<typename CollectionType>
void silentSpill(const CollectionType& savePlans)
}
template<typename CollectionType>
- void silentFill(const CollectionType& savePlans, GPRReg exclude = InvalidGPRReg)
+ void silentFill(const CollectionType& savePlans)
{
- GPRReg canTrample = SpeculativeJIT::pickCanTrample(exclude);
for (unsigned i = savePlans.size(); i--;)
- silentFill(savePlans[i], canTrample);
+ silentFill(savePlans[i]);
}
template<typename CollectionType>
silentSpillAllRegisters(exclude.payloadGPR(), exclude.tagGPR());
#endif
}
-
- static GPRReg pickCanTrample(GPRReg exclude)
- {
- GPRReg result = GPRInfo::regT0;
- if (result == exclude)
- result = GPRInfo::regT1;
- return result;
- }
- static GPRReg pickCanTrample(FPRReg)
- {
- return GPRInfo::regT0;
- }
- static GPRReg pickCanTrample(NoResultTag)
- {
- return GPRInfo::regT0;
- }
-#if USE(JSVALUE64)
- static GPRReg pickCanTrample(JSValueRegs exclude)
+ void silentFillAllRegisters()
{
- return pickCanTrample(exclude.payloadGPR());
- }
-#else
- static GPRReg pickCanTrample(JSValueRegs exclude)
- {
- GPRReg result = GPRInfo::regT0;
- if (result == exclude.tagGPR()) {
- result = GPRInfo::regT1;
- if (result == exclude.payloadGPR())
- result = GPRInfo::regT2;
- } else if (result == exclude.payloadGPR()) {
- result = GPRInfo::regT1;
- if (result == exclude.tagGPR())
- result = GPRInfo::regT2;
- }
- return result;
- }
-#endif
-
- template<typename RegisterType>
- void silentFillAllRegisters(RegisterType exclude)
- {
- GPRReg canTrample = pickCanTrample(exclude);
-
while (!m_plans.isEmpty()) {
SilentRegisterSavePlan& plan = m_plans.last();
- silentFill(plan, canTrample);
+ silentFill(plan);
m_plans.removeLast();
}
}
silentSpillAllRegisters(resultGPR);
callOperation(helperFunction, resultGPR, arg1Regs, arg2Regs);
m_jit.exceptionCheck();
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
branchTest32(callResultCondition, resultGPR, taken);
}
silentSpillAllRegisters(resultPayloadGPR);
callOperation(operationCompareStrictEqCell, resultPayloadGPR, arg1Regs, arg2Regs);
m_jit.exceptionCheck();
- silentFillAllRegisters(resultPayloadGPR);
-
+ silentFillAllRegisters();
+
branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, resultPayloadGPR, taken);
} else {
// FIXME: Add fast paths for twoCells, number etc.
silentSpillAllRegisters(resultPayloadGPR);
callOperation(operationCompareStrictEq, resultPayloadGPR, arg1Regs, arg2Regs);
m_jit.exceptionCheck();
- silentFillAllRegisters(resultPayloadGPR);
-
+ silentFillAllRegisters();
+
branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, resultPayloadGPR, taken);
}
silentSpillAllRegisters(resultPayloadGPR);
callOperation(operationCompareStrictEqCell, resultPayloadGPR, arg1Regs, arg2Regs);
m_jit.exceptionCheck();
- silentFillAllRegisters(resultPayloadGPR);
-
+ silentFillAllRegisters();
+
m_jit.andPtr(JITCompiler::TrustedImm32(1), resultPayloadGPR);
done.link(&m_jit);
silentSpillAllRegisters(resultPayloadGPR);
callOperation(operationCompareStrictEq, resultPayloadGPR, arg1Regs, arg2Regs);
- silentFillAllRegisters(resultPayloadGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
m_jit.andPtr(JITCompiler::TrustedImm32(1), resultPayloadGPR);
silentSpillAllRegisters(InvalidGPRReg);
callOperation(operationLinkDirectCall, info, calleePayloadGPR);
- silentFillAllRegisters(InvalidGPRReg);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
m_jit.jump().linkTo(mainPath, &m_jit);
notNumber.link(&m_jit);
silentSpillAllRegisters(resultRegs);
callOperation(operationToNumber, resultRegs, argumentRegs);
- silentFillAllRegisters(resultRegs);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
done.link(&m_jit);
keyRegs = JSValueRegs(tempGPR, keyRegs.payloadGPR());
}
callOperation(operationHasOwnProperty, resultGPR, objectGPR, keyRegs);
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
done.link(&m_jit);
silentSpillAllRegisters(resultGPR);
callOperation(helperFunction, resultGPR, arg1GPR, arg2GPR);
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
branchTest32(callResultCondition, resultGPR, taken);
silentSpillAllRegisters(resultGPR);
callOperation(operationCompareStrictEqCell, resultGPR, arg1GPR, arg2GPR);
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, resultGPR, taken);
silentSpillAllRegisters(resultGPR);
callOperation(operationCompareStrictEq, resultGPR, arg1GPR, arg2GPR);
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, resultGPR, taken);
silentSpillAllRegisters(resultGPR);
callOperation(operationCompareStrictEqCell, resultGPR, arg1GPR, arg2GPR);
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
m_jit.and64(JITCompiler::TrustedImm32(1), resultGPR);
silentSpillAllRegisters(InvalidGPRReg);
callOperation(operationLinkDirectCall, callLinkInfo, calleeGPR);
- silentFillAllRegisters(InvalidGPRReg);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
m_jit.jump().linkTo(mainPath, &m_jit);
for (unsigned i = numExtraArgs; i--;)
m_jit.boxInt32(argGPRs[i], JSValueRegs(argGPRs[i]));
callSlowPath();
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
}
notNumber.link(&m_jit);
silentSpillAllRegisters(resultGPR);
callOperation(operationToNumber, resultGPR, argumentGPR);
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
done.link(&m_jit);
slowPath.link(&m_jit);
silentSpillAllRegisters(resultGPR);
callOperation(operationMapHash, resultGPR, JSValueRegs(inputGPR));
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
done.link(&m_jit);
slowPath.link(&m_jit);
silentSpillAllRegisters(resultGPR);
callOperation(operationMapHash, resultGPR, JSValueRegs(inputGPR));
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
done.link(&m_jit);
callOperation(operationJSMapFindBucket, resultGPR, mapGPR, keyGPR, hashGPR);
else
callOperation(operationJSSetFindBucket, resultGPR, mapGPR, keyGPR, hashGPR);
- silentFillAllRegisters(indexGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
done.append(m_jit.jump());
}
slowPath.link(&m_jit);
silentSpillAllRegisters(resultGPR);
callOperation(operationHasOwnProperty, resultGPR, objectGPR, keyGPR);
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
m_jit.exceptionCheck();
done.link(&m_jit);
silentSpillAllRegisters(InvalidGPRReg);
m_jit.setupArgumentsExecState();
appendCall(triggerTierUpNow);
- silentFillAllRegisters(InvalidGPRReg);
+ silentFillAllRegisters();
done.link(&m_jit);
break;
notInt32.link(&m_jit);
silentSpillAllRegisters(resultGPR);
callOperation(operationConvertBoxedDoubleToInt52, resultGPR, valueGPR);
- silentFillAllRegisters(resultGPR);
+ silentFillAllRegisters();
DFG_TYPE_CHECK(
JSValueRegs(valueGPR), valueEdge, SpecInt32Only | SpecAnyIntAsDouble,