Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (193794 => 193795)
--- trunk/Source/_javascript_Core/ChangeLog 2015-12-09 00:23:01 UTC (rev 193794)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-12-09 00:30:18 UTC (rev 193795)
@@ -1,5 +1,21 @@
2015-12-08 Mark Lam <mark....@apple.com>
+ Factoring out common DFG code for bitwise and shift operators.
+ https://bugs.webkit.org/show_bug.cgi?id=152019
+
+ Reviewed by Michael Saboff.
+
+ * dfg/DFGSpeculativeJIT.cpp:
+ (JSC::DFG::SpeculativeJIT::compileBitwiseOp):
+ (JSC::DFG::SpeculativeJIT::compileShiftOp):
+ * dfg/DFGSpeculativeJIT.h:
+ * dfg/DFGSpeculativeJIT32_64.cpp:
+ (JSC::DFG::SpeculativeJIT::compile):
+ * dfg/DFGSpeculativeJIT64.cpp:
+ (JSC::DFG::SpeculativeJIT::compile):
+
+2015-12-08 Mark Lam <mark....@apple.com>
+
DFG and FTL should be resilient against cases where both snippet operands are constant.
https://bugs.webkit.org/show_bug.cgi?id=152017
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (193794 => 193795)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2015-12-09 00:23:01 UTC (rev 193794)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2015-12-09 00:30:18 UTC (rev 193795)
@@ -2786,6 +2786,68 @@
blessedBooleanResult(scratchReg, node);
}
+void SpeculativeJIT::compileBitwiseOp(Node* node)
+{
+ NodeType op = node->op();
+ Edge& leftChild = node->child1();
+ Edge& rightChild = node->child2();
+
+ if (leftChild->isInt32Constant()) {
+ SpeculateInt32Operand op2(this, rightChild);
+ GPRTemporary result(this, Reuse, op2);
+
+ bitOp(op, leftChild->asInt32(), op2.gpr(), result.gpr());
+
+ int32Result(result.gpr(), node);
+
+ } else if (rightChild->isInt32Constant()) {
+ SpeculateInt32Operand op1(this, leftChild);
+ GPRTemporary result(this, Reuse, op1);
+
+ bitOp(op, rightChild->asInt32(), op1.gpr(), result.gpr());
+
+ int32Result(result.gpr(), node);
+
+ } else {
+ SpeculateInt32Operand op1(this, leftChild);
+ SpeculateInt32Operand op2(this, rightChild);
+ GPRTemporary result(this, Reuse, op1, op2);
+
+ GPRReg reg1 = op1.gpr();
+ GPRReg reg2 = op2.gpr();
+ bitOp(op, reg1, reg2, result.gpr());
+
+ int32Result(result.gpr(), node);
+ }
+}
+
+void SpeculativeJIT::compileShiftOp(Node* node)
+{
+ NodeType op = node->op();
+ Edge& leftChild = node->child1();
+ Edge& rightChild = node->child2();
+
+ if (rightChild->isInt32Constant()) {
+ SpeculateInt32Operand op1(this, leftChild);
+ GPRTemporary result(this, Reuse, op1);
+
+ shiftOp(op, op1.gpr(), rightChild->asInt32() & 0x1f, result.gpr());
+
+ int32Result(result.gpr(), node);
+ } else {
+ // Do not allow shift amount to be used as the result, MacroAssembler does not permit this.
+ SpeculateInt32Operand op1(this, leftChild);
+ SpeculateInt32Operand op2(this, rightChild);
+ GPRTemporary result(this, Reuse, op1);
+
+ GPRReg reg1 = op1.gpr();
+ GPRReg reg2 = op2.gpr();
+ shiftOp(op, reg1, reg2, result.gpr());
+
+ int32Result(result.gpr(), node);
+ }
+}
+
void SpeculativeJIT::compileValueAdd(Node* node)
{
Edge& leftChild = node->child1();
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h (193794 => 193795)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h 2015-12-09 00:23:01 UTC (rev 193794)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h 2015-12-09 00:30:18 UTC (rev 193795)
@@ -2212,6 +2212,8 @@
void compileValueToInt32(Node*);
void compileUInt32ToNumber(Node*);
void compileDoubleAsInt32(Node*);
+ void compileBitwiseOp(Node*);
+ void compileShiftOp(Node*);
void compileValueAdd(Node*);
void compileArithAdd(Node*);
void compileMakeRope(Node*);
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp (193794 => 193795)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp 2015-12-09 00:23:01 UTC (rev 193794)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT32_64.cpp 2015-12-09 00:30:18 UTC (rev 193795)
@@ -2059,55 +2059,13 @@
case BitAnd:
case BitOr:
case BitXor:
- if (node->child1()->isInt32Constant()) {
- SpeculateInt32Operand op2(this, node->child2());
- GPRTemporary result(this, Reuse, op2);
-
- bitOp(op, node->child1()->asInt32(), op2.gpr(), result.gpr());
-
- int32Result(result.gpr(), node);
- } else if (node->child2()->isInt32Constant()) {
- SpeculateInt32Operand op1(this, node->child1());
- GPRTemporary result(this, Reuse, op1);
-
- bitOp(op, node->child2()->asInt32(), op1.gpr(), result.gpr());
-
- int32Result(result.gpr(), node);
- } else {
- SpeculateInt32Operand op1(this, node->child1());
- SpeculateInt32Operand op2(this, node->child2());
- GPRTemporary result(this, Reuse, op1, op2);
-
- GPRReg reg1 = op1.gpr();
- GPRReg reg2 = op2.gpr();
- bitOp(op, reg1, reg2, result.gpr());
-
- int32Result(result.gpr(), node);
- }
+ compileBitwiseOp(node);
break;
case BitRShift:
case BitLShift:
case BitURShift:
- if (node->child2()->isInt32Constant()) {
- SpeculateInt32Operand op1(this, node->child1());
- GPRTemporary result(this, Reuse, op1);
-
- shiftOp(op, op1.gpr(), node->child2()->asInt32() & 0x1f, result.gpr());
-
- int32Result(result.gpr(), node);
- } else {
- // Do not allow shift amount to be used as the result, MacroAssembler does not permit this.
- SpeculateInt32Operand op1(this, node->child1());
- SpeculateInt32Operand op2(this, node->child2());
- GPRTemporary result(this, Reuse, op1);
-
- GPRReg reg1 = op1.gpr();
- GPRReg reg2 = op2.gpr();
- shiftOp(op, reg1, reg2, result.gpr());
-
- int32Result(result.gpr(), node);
- }
+ compileShiftOp(node);
break;
case UInt32ToNumber: {
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp (193794 => 193795)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp 2015-12-09 00:23:01 UTC (rev 193794)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp 2015-12-09 00:30:18 UTC (rev 193795)
@@ -2144,55 +2144,13 @@
case BitAnd:
case BitOr:
case BitXor:
- if (node->child1()->isInt32Constant()) {
- SpeculateInt32Operand op2(this, node->child2());
- GPRTemporary result(this, Reuse, op2);
-
- bitOp(op, node->child1()->asInt32(), op2.gpr(), result.gpr());
-
- int32Result(result.gpr(), node);
- } else if (node->child2()->isInt32Constant()) {
- SpeculateInt32Operand op1(this, node->child1());
- GPRTemporary result(this, Reuse, op1);
-
- bitOp(op, node->child2()->asInt32(), op1.gpr(), result.gpr());
-
- int32Result(result.gpr(), node);
- } else {
- SpeculateInt32Operand op1(this, node->child1());
- SpeculateInt32Operand op2(this, node->child2());
- GPRTemporary result(this, Reuse, op1, op2);
-
- GPRReg reg1 = op1.gpr();
- GPRReg reg2 = op2.gpr();
- bitOp(op, reg1, reg2, result.gpr());
-
- int32Result(result.gpr(), node);
- }
+ compileBitwiseOp(node);
break;
case BitRShift:
case BitLShift:
case BitURShift:
- if (node->child2()->isInt32Constant()) {
- SpeculateInt32Operand op1(this, node->child1());
- GPRTemporary result(this, Reuse, op1);
-
- shiftOp(op, op1.gpr(), node->child2()->asInt32() & 0x1f, result.gpr());
-
- int32Result(result.gpr(), node);
- } else {
- // Do not allow shift amount to be used as the result, MacroAssembler does not permit this.
- SpeculateInt32Operand op1(this, node->child1());
- SpeculateInt32Operand op2(this, node->child2());
- GPRTemporary result(this, Reuse, op1);
-
- GPRReg reg1 = op1.gpr();
- GPRReg reg2 = op2.gpr();
- shiftOp(op, reg1, reg2, result.gpr());
-
- int32Result(result.gpr(), node);
- }
+ compileShiftOp(node);
break;
case UInt32ToNumber: {