Index: src/compiler/representation-change.h |
diff --git a/src/compiler/representation-change.h b/src/compiler/representation-change.h |
index aaa248eab86f65e29e8284ab091500d4f29abbc7..e9486f332a3f77aa09cc449419a23bfaa665a1f8 100644 |
--- a/src/compiler/representation-change.h |
+++ b/src/compiler/representation-change.h |
@@ -51,10 +51,10 @@ class RepresentationChanger { |
} |
if (use_type & kRepTagged) { |
return GetTaggedRepresentationFor(node, output_type); |
+ } else if (use_type & kRepFloat32) { |
+ return GetFloat32RepresentationFor(node, output_type); |
} else if (use_type & kRepFloat64) { |
return GetFloat64RepresentationFor(node, output_type); |
- } else if (use_type & kRepFloat32) { |
- return TypeError(node, output_type, use_type); // TODO(titzer): handle |
} else if (use_type & kRepBit) { |
return GetBitRepresentationFor(node, output_type); |
} else if (use_type & rWord) { |
@@ -103,6 +103,10 @@ class RepresentationChanger { |
} else { |
return TypeError(node, output_type, kRepTagged); |
} |
+ } else if (output_type & kRepFloat32) { |
+ node = jsgraph()->graph()->NewNode(machine()->ChangeFloat32ToFloat64(), |
+ node); |
+ op = simplified()->ChangeFloat64ToTagged(); |
} else if (output_type & kRepFloat64) { |
op = simplified()->ChangeFloat64ToTagged(); |
} else { |
@@ -111,6 +115,19 @@ class RepresentationChanger { |
return jsgraph()->graph()->NewNode(op, node); |
} |
+ Node* GetFloat32RepresentationFor(Node* node, MachineTypeUnion output_type) { |
+ // Eagerly fold representation changes for constants. |
+ switch (node->opcode()) { |
+ // TODO(turbofan): NumberConstant, Int32Constant, and Float64Constant? |
+ case IrOpcode::kFloat32Constant: |
+ return node; // No change necessary. |
+ default: |
+ break; |
+ } |
+ // TODO(turbofan): Select the correct X -> Float32 operator. |
+ return TypeError(node, output_type, kRepFloat32); |
+ } |
+ |
Node* GetFloat64RepresentationFor(Node* node, MachineTypeUnion output_type) { |
// Eagerly fold representation changes for constants. |
switch (node->opcode()) { |
@@ -141,6 +158,8 @@ class RepresentationChanger { |
} |
} else if (output_type & kRepTagged) { |
op = simplified()->ChangeTaggedToFloat64(); |
+ } else if (output_type & kRepFloat32) { |
+ op = machine()->ChangeFloat32ToFloat64(); |
} else { |
return TypeError(node, output_type, kRepFloat64); |
} |
@@ -353,8 +372,9 @@ class RepresentationChanger { |
SimplifiedOperatorBuilder* simplified() { return simplified_; } |
MachineOperatorBuilder* machine() { return jsgraph()->machine(); } |
}; |
-} |
-} |
-} // namespace v8::internal::compiler |
+ |
+} // namespace compiler |
+} // namespace internal |
+} // namespace v8 |
#endif // V8_COMPILER_REPRESENTATION_CHANGE_H_ |