Index: src/compiler/representation-change.h |
diff --git a/src/compiler/representation-change.h b/src/compiler/representation-change.h |
index 3b6f183056fe57e4433f772b62e20b60df60f117..5e7a8d04c687fe8152a92e2484d9c20336e23e4d 100644 |
--- a/src/compiler/representation-change.h |
+++ b/src/compiler/representation-change.h |
@@ -216,6 +216,37 @@ class RepresentationChanger { |
} |
} |
+ Node* GetTruncatedWord32For(Node* node, MachineTypeUnion output_type) { |
+ // Eagerly fold truncations for constants. |
+ switch (node->opcode()) { |
+ case IrOpcode::kInt32Constant: |
+ return node; // No change necessary. |
+ case IrOpcode::kFloat32Constant: |
+ return jsgraph()->Int32Constant( |
+ DoubleToInt32(OpParameter<float>(node))); |
+ case IrOpcode::kNumberConstant: |
+ case IrOpcode::kFloat64Constant: |
+ return jsgraph()->Int32Constant( |
+ DoubleToInt32(OpParameter<double>(node))); |
+ default: |
+ break; |
+ } |
+ // Select the correct X -> Word32 truncation operator. |
+ const Operator* op = NULL; |
+ if (output_type & kRepFloat64) { |
+ op = machine()->TruncateFloat64ToInt32(); |
+ } else if (output_type & kRepFloat32) { |
+ node = InsertChangeFloat32ToFloat64(node); |
+ op = machine()->TruncateFloat64ToInt32(); |
+ } else if (output_type & kRepTagged) { |
+ node = InsertChangeTaggedToFloat64(node); |
+ op = machine()->TruncateFloat64ToInt32(); |
+ } else { |
+ return TypeError(node, output_type, kRepWord32); |
+ } |
+ return jsgraph()->graph()->NewNode(op, node); |
+ } |
+ |
Node* GetWord32RepresentationFor(Node* node, MachineTypeUnion output_type, |
bool use_unsigned) { |
// Eagerly fold representation changes for constants. |
@@ -421,6 +452,11 @@ class RepresentationChanger { |
node); |
} |
+ Node* InsertChangeTaggedToFloat64(Node* node) { |
+ return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(), |
+ node); |
+ } |
+ |
JSGraph* jsgraph() { return jsgraph_; } |
Isolate* isolate() { return isolate_; } |
SimplifiedOperatorBuilder* simplified() { return simplified_; } |