Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (226259 => 226260)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2017-12-22 06:25:24 UTC (rev 226259)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2017-12-22 08:19:55 UTC (rev 226260)
@@ -2255,15 +2255,10 @@
if (child.useKind() == UntypedUse) {
JSValueOperand opr(this, child);
JSValueRegs oprRegs = opr.jsValueRegs();
-#if USE(JSVALUE64)
- GPRTemporary result(this);
- JSValueRegs resultRegs = JSValueRegs(result.gpr());
-#else
- GPRTemporary resultTag(this);
- GPRTemporary resultPayload(this);
- JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr());
-#endif
+
flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
callOperation(operationStringFromCharCodeUntyped, resultRegs, oprRegs);
m_jit.exceptionCheck();
@@ -3227,18 +3222,10 @@
speculateObject(node->child1(), arg1GPR);
speculateString(node->child2(), arg2GPR);
- GPRFlushedCallResult resultPayload(this);
- GPRReg resultPayloadGPR = resultPayload.gpr();
-#if USE(JSVALUE64)
- JSValueRegs resultRegs(resultPayloadGPR);
-#else
- GPRFlushedCallResult2 resultTag(this);
- GPRReg resultTagGPR = resultTag.gpr();
- JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);
-#endif
-
flushRegisters();
- callOperation(operationGetByValObjectString, extractResult(resultRegs), arg1GPR, arg2GPR);
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
+ callOperation(operationGetByValObjectString, resultRegs, arg1GPR, arg2GPR);
m_jit.exceptionCheck();
jsValueResult(resultRegs, node);
@@ -3255,18 +3242,10 @@
speculateObject(node->child1(), arg1GPR);
speculateSymbol(node->child2(), arg2GPR);
- GPRFlushedCallResult resultPayload(this);
- GPRReg resultPayloadGPR = resultPayload.gpr();
-#if USE(JSVALUE64)
- JSValueRegs resultRegs(resultPayloadGPR);
-#else
- GPRFlushedCallResult2 resultTag(this);
- GPRReg resultTagGPR = resultTag.gpr();
- JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);
-#endif
-
flushRegisters();
- callOperation(operationGetByValObjectSymbol, extractResult(resultRegs), arg1GPR, arg2GPR);
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
+ callOperation(operationGetByValObjectSymbol, resultRegs, arg1GPR, arg2GPR);
m_jit.exceptionCheck();
jsValueResult(resultRegs, node);
@@ -3388,72 +3367,57 @@
void SpeculativeJIT::compileParseInt(Node* node)
{
RELEASE_ASSERT(node->child1().useKind() == UntypedUse || node->child1().useKind() == StringUse);
-
- GPRFlushedCallResult resultPayload(this);
- GPRReg resultPayloadGPR = resultPayload.gpr();
-#if USE(JSVALUE64)
- JSValueRegs resultRegs(resultPayloadGPR);
-#else
- GPRFlushedCallResult2 resultTag(this);
- GPRReg resultTagGPR = resultTag.gpr();
- JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);
-#endif
-
if (node->child2()) {
SpeculateInt32Operand radix(this, node->child2());
GPRReg radixGPR = radix.gpr();
if (node->child1().useKind() == UntypedUse) {
JSValueOperand value(this, node->child1());
-#if USE(JSVALUE64)
- auto result = resultRegs.gpr();
- auto valueReg = value.gpr();
-#else
- auto result = resultRegs;
- auto valueReg = value.jsValueRegs();
-#endif
+ JSValueRegs valueRegs = value.jsValueRegs();
flushRegisters();
- callOperation(operationParseIntGeneric, result, valueReg, radixGPR);
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
+ callOperation(operationParseIntGeneric, resultRegs, valueRegs, radixGPR);
m_jit.exceptionCheck();
- } else {
- SpeculateCellOperand value(this, node->child1());
- GPRReg valueGPR = value.gpr();
- speculateString(node->child1(), valueGPR);
+ jsValueResult(resultRegs, node);
+ return;
+ }
-#if USE(JSVALUE64)
- auto result = resultRegs.gpr();
-#else
- auto result = resultRegs;
-#endif
+ SpeculateCellOperand value(this, node->child1());
+ GPRReg valueGPR = value.gpr();
+ speculateString(node->child1(), valueGPR);
- flushRegisters();
- callOperation(operationParseIntString, result, valueGPR, radixGPR);
- m_jit.exceptionCheck();
- }
- } else {
- if (node->child1().useKind() == UntypedUse) {
- JSValueOperand value(this, node->child1());
-#if USE(JSVALUE64)
- auto result = resultRegs.gpr();
-#else
- auto result = resultRegs;
-#endif
- JSValueRegs valueRegs = value.jsValueRegs();
+ flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
+ callOperation(operationParseIntString, resultRegs, valueGPR, radixGPR);
+ m_jit.exceptionCheck();
+ jsValueResult(resultRegs, node);
+ return;
+ }
- flushRegisters();
- callOperation(operationParseIntNoRadixGeneric, result, valueRegs);
- m_jit.exceptionCheck();
- } else {
- SpeculateCellOperand value(this, node->child1());
- GPRReg valueGPR = value.gpr();
- speculateString(node->child1(), valueGPR);
+ if (node->child1().useKind() == UntypedUse) {
+ JSValueOperand value(this, node->child1());
+ JSValueRegs valueRegs = value.jsValueRegs();
- flushRegisters();
- callOperation(operationParseIntStringNoRadix, resultRegs, valueGPR);
- m_jit.exceptionCheck();
- }
+ flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
+ callOperation(operationParseIntNoRadixGeneric, resultRegs, valueRegs);
+ m_jit.exceptionCheck();
+ jsValueResult(resultRegs, node);
+ return;
}
+ SpeculateCellOperand value(this, node->child1());
+ GPRReg valueGPR = value.gpr();
+ speculateString(node->child1(), valueGPR);
+
+ flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
+ callOperation(operationParseIntStringNoRadix, resultRegs, valueGPR);
+ m_jit.exceptionCheck();
jsValueResult(resultRegs, node);
}
@@ -3520,15 +3484,10 @@
JSValueOperand right(this, rightChild);
JSValueRegs leftRegs = left.jsValueRegs();
JSValueRegs rightRegs = right.jsValueRegs();
-#if USE(JSVALUE64)
- GPRTemporary result(this);
- JSValueRegs resultRegs = JSValueRegs(result.gpr());
-#else
- GPRTemporary resultTag(this);
- GPRTemporary resultPayload(this);
- JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr());
-#endif
+
flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
callOperation(snippetSlowPathFunction, resultRegs, leftRegs, rightRegs);
m_jit.exceptionCheck();
@@ -3667,15 +3626,10 @@
JSValueOperand right(this, rightChild);
JSValueRegs leftRegs = left.jsValueRegs();
JSValueRegs rightRegs = right.jsValueRegs();
-#if USE(JSVALUE64)
- GPRTemporary result(this);
- JSValueRegs resultRegs = JSValueRegs(result.gpr());
-#else
- GPRTemporary resultTag(this);
- GPRTemporary resultPayload(this);
- JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr());
-#endif
+
flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
callOperation(snippetSlowPathFunction, resultRegs, leftRegs, rightRegs);
m_jit.exceptionCheck();
@@ -3807,15 +3761,10 @@
JSValueOperand right(this, rightChild);
JSValueRegs leftRegs = left.jsValueRegs();
JSValueRegs rightRegs = right.jsValueRegs();
-#if USE(JSVALUE64)
- GPRTemporary result(this);
- JSValueRegs resultRegs = JSValueRegs(result.gpr());
-#else
- GPRTemporary resultTag(this);
- GPRTemporary resultPayload(this);
- JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr());
-#endif
+
flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
callOperation(operationValueAddNotNumber, resultRegs, leftRegs, rightRegs);
m_jit.exceptionCheck();
@@ -4831,15 +4780,10 @@
JSValueOperand right(this, rightChild);
JSValueRegs leftRegs = left.jsValueRegs();
JSValueRegs rightRegs = right.jsValueRegs();
-#if USE(JSVALUE64)
- GPRTemporary result(this);
- JSValueRegs resultRegs = JSValueRegs(result.gpr());
-#else
- GPRTemporary resultTag(this);
- GPRTemporary resultPayload(this);
- JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr());
-#endif
+
flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
callOperation(operationValueMul, resultRegs, leftRegs, rightRegs);
m_jit.exceptionCheck();
@@ -5013,15 +4957,10 @@
JSValueOperand right(this, rightChild);
JSValueRegs leftRegs = left.jsValueRegs();
JSValueRegs rightRegs = right.jsValueRegs();
-#if USE(JSVALUE64)
- GPRTemporary result(this);
- JSValueRegs resultRegs = JSValueRegs(result.gpr());
-#else
- GPRTemporary resultTag(this);
- GPRTemporary resultPayload(this);
- JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr());
-#endif
+
flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
callOperation(operationValueDiv, resultRegs, leftRegs, rightRegs);
m_jit.exceptionCheck();
@@ -5519,15 +5458,10 @@
JSValueOperand argument(this, node->child1());
JSValueRegs argumentRegs = argument.jsValueRegs();
-#if USE(JSVALUE64)
- GPRTemporary result(this);
- JSValueRegs resultRegs = JSValueRegs(result.gpr());
-#else
- GPRTemporary resultTag(this);
- GPRTemporary resultPayload(this);
- JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr());
-#endif
+
flushRegisters();
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
J_JITOperation_EJ operation = nullptr;
if (node->op() == ArithRound)
operation = operationArithRound;
@@ -10394,21 +10328,12 @@
{
SpeculateCellOperand scope(this, node->child1());
GPRReg scopeGPR = scope.gpr();
-#if USE(JSVALUE64)
- GPRFlushedCallResult result(this);
- GPRReg resultGPR = result.gpr();
flushRegisters();
- callOperation(operationResolveScopeForHoistingFuncDeclInEval, resultGPR, scopeGPR, identifierUID(node->identifierNumber()));
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
+ callOperation(operationResolveScopeForHoistingFuncDeclInEval, resultRegs, scopeGPR, identifierUID(node->identifierNumber()));
m_jit.exceptionCheck();
- jsValueResult(result.gpr(), node);
-#else
- flushRegisters();
- GPRFlushedCallResult2 resultTag(this);
- GPRFlushedCallResult resultPayload(this);
- callOperation(operationResolveScopeForHoistingFuncDeclInEval, JSValueRegs(resultTag.gpr(), resultPayload.gpr()), scopeGPR, identifierUID(node->identifierNumber()));
- m_jit.exceptionCheck();
- jsValueResult(resultTag.gpr(), resultPayload.gpr(), node);
-#endif
+ jsValueResult(resultRegs, node);
}
void SpeculativeJIT::compileGetDynamicVar(Node* node)
@@ -10415,20 +10340,12 @@
{
SpeculateCellOperand scope(this, node->child1());
GPRReg scopeGPR = scope.gpr();
-#if USE(JSVALUE64)
flushRegisters();
- GPRFlushedCallResult result(this);
- callOperation(operationGetDynamicVar, result.gpr(), scopeGPR, identifierUID(node->identifierNumber()), node->getPutInfo());
+ JSValueRegsFlushedCallResult result(this);
+ JSValueRegs resultRegs = result.regs();
+ callOperation(operationGetDynamicVar, resultRegs, scopeGPR, identifierUID(node->identifierNumber()), node->getPutInfo());
m_jit.exceptionCheck();
- jsValueResult(result.gpr(), node);
-#else
- flushRegisters();
- GPRFlushedCallResult2 resultTag(this);
- GPRFlushedCallResult resultPayload(this);
- callOperation(operationGetDynamicVar, JSValueRegs(resultTag.gpr(), resultPayload.gpr()), scopeGPR, identifierUID(node->identifierNumber()), node->getPutInfo());
- m_jit.exceptionCheck();
- jsValueResult(resultTag.gpr(), resultPayload.gpr(), node);
-#endif
+ jsValueResult(resultRegs, node);
}
void SpeculativeJIT::compilePutDynamicVar(Node* node)
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h (226259 => 226260)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h 2017-12-22 06:25:24 UTC (rev 226259)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h 2017-12-22 08:19:55 UTC (rev 226260)
@@ -1453,6 +1453,11 @@
m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(uid));
return appendCallSetResult(operation, result);
}
+ JITCompiler::Call callOperation(J_JITOperation_EJscI operation, JSValueRegs result, GPRReg arg1, UniquedStringImpl* impl)
+ {
+ m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(impl));
+ return appendCallSetResult(operation, result.payloadGPR());
+ }
JITCompiler::Call callOperation(J_JITOperation_EJscI operation, GPRReg result, GPRReg arg1, UniquedStringImpl* impl)
{
m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(impl));
@@ -1513,6 +1518,11 @@
m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(impl), TrustedImm32(value));
return appendCall(operation);
}
+ JITCompiler::Call callOperation(J_JITOperation_EOIUi operation, JSValueRegs result, GPRReg arg1, UniquedStringImpl* impl, unsigned value)
+ {
+ m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(impl), TrustedImm32(value));
+ return appendCallSetResult(operation, result.payloadGPR());
+ }
JITCompiler::Call callOperation(J_JITOperation_EOIUi operation, GPRReg result, GPRReg arg1, UniquedStringImpl* impl, unsigned value)
{
m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(impl), TrustedImm32(value));
@@ -1570,6 +1580,11 @@
m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
return appendCallSetResult(operation, result);
}
+ JITCompiler::Call callOperation(J_JITOperation_EJssZ operation, JSValueRegs result, GPRReg arg1, GPRReg arg2)
+ {
+ m_jit.setupArgumentsWithExecState(arg1, arg2);
+ return appendCallSetResult(operation, result.payloadGPR());
+ }
JITCompiler::Call callOperation(J_JITOperation_EJssZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
{
m_jit.setupArgumentsWithExecState(arg1, arg2);
@@ -1625,9 +1640,14 @@
m_jit.setupArgumentsWithExecState(arg1, arg2);
return appendCallSetResult(operation, result);
}
- JITCompiler::Call callOperation(J_JITOperation_EJZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
+ JITCompiler::Call callOperation(J_JITOperation_EJZ operation, JSValueRegs result, JSValueRegs arg1, GPRReg arg2)
{
- m_jit.setupArgumentsWithExecState(arg1, arg2);
+ m_jit.setupArgumentsWithExecState(arg1.payloadGPR(), arg2);
+ return appendCallSetResult(operation, result.payloadGPR());
+ }
+ JITCompiler::Call callOperation(J_JITOperation_EJZ operation, GPRReg result, JSValueRegs arg1, GPRReg arg2)
+ {
+ m_jit.setupArgumentsWithExecState(arg1.payloadGPR(), arg2);
return appendCallSetResult(operation, result);
}
JITCompiler::Call callOperation(J_JITOperation_EJA operation, JSValueRegs result, JSValueRegs arg1, GPRReg arg2)
@@ -1871,6 +1891,11 @@
m_jit.setupArgumentsWithExecState(arg1, arg2, arg3, arg4);
return appendCallSetResult(operation, result);
}
+ JITCompiler::Call callOperation(J_JITOperation_ECC operation, JSValueRegs result, GPRReg arg1, GPRReg arg2)
+ {
+ m_jit.setupArgumentsWithExecState(arg1, arg2);
+ return appendCallSetResult(operation, result.payloadGPR());
+ }
JITCompiler::Call callOperation(J_JITOperation_ECC operation, GPRReg result, GPRReg arg1, GPRReg arg2)
{
m_jit.setupArgumentsWithExecState(arg1, arg2);
@@ -3674,7 +3699,37 @@
}
};
+class JSValueRegsFlushedCallResult {
+public:
+ JSValueRegsFlushedCallResult(SpeculativeJIT* jit)
+#if USE(JSVALUE64)
+ : m_gpr(jit)
+#else
+ : m_payloadGPR(jit)
+ , m_tagGPR(jit)
+#endif
+ {
+ }
+ JSValueRegs regs()
+ {
+#if USE(JSVALUE64)
+ return JSValueRegs { m_gpr.gpr() };
+#else
+ return JSValueRegs { m_tagGPR.gpr(), m_payloadGPR.gpr() };
+#endif
+ }
+
+private:
+#if USE(JSVALUE64)
+ GPRFlushedCallResult m_gpr;
+#else
+ GPRFlushedCallResult m_payloadGPR;
+ GPRFlushedCallResult2 m_tagGPR;
+#endif
+};
+
+
// === Speculative Operand types ===
//
// SpeculateInt32Operand, SpeculateStrictInt32Operand and SpeculateCellOperand.