Index: src/compiler/representation-change.h |
diff --git a/src/compiler/representation-change.h b/src/compiler/representation-change.h |
index 8720afdde3ff8938e46ed2f1ab19a647e591e3da..909ca62b45ae52e496ff0439082adc6f721cc3aa 100644 |
--- a/src/compiler/representation-change.h |
+++ b/src/compiler/representation-change.h |
@@ -27,12 +27,14 @@ class RepresentationChanger { |
: jsgraph_(jsgraph), |
simplified_(simplified), |
isolate_(isolate), |
+ bit_range_(Type::Range(isolate->factory()->NewNumber(0), |
+ isolate->factory()->NewNumber(1), |
+ jsgraph->zone())), |
testing_type_errors_(false), |
type_error_(false) {} |
// TODO(titzer): should Word64 also be implicitly convertable to others? |
- static const MachineTypeUnion rWord = |
- kRepBit | kRepWord8 | kRepWord16 | kRepWord32; |
+ static const MachineTypeUnion rWord = kRepWord8 | kRepWord16 | kRepWord32; |
Node* GetRepresentationFor(Node* node, MachineTypeUnion output_type, |
MachineTypeUnion use_type) { |
@@ -262,8 +264,10 @@ class RepresentationChanger { |
break; |
} |
// Select the correct X -> Word32 operator. |
- const Operator* op = NULL; |
- if (output_type & kRepFloat64) { |
+ const Operator* op; |
+ if (output_type & kRepBit) { |
+ return node; // No change necessary. |
+ } else if (output_type & kRepFloat64) { |
if (output_type & kTypeUint32 || use_unsigned) { |
op = machine()->ChangeFloat64ToUint32(); |
} else { |
@@ -298,17 +302,12 @@ class RepresentationChanger { |
} |
case IrOpcode::kNumberConstant: { |
double value = OpParameter<double>(node); |
- if (std::isnan(value) || value == 0.0) { |
- return jsgraph()->Int32Constant(0); |
- } |
- return jsgraph()->Int32Constant(1); |
+ if (value == 0 || std::isnan(value)) return jsgraph()->Int32Constant(0); |
+ return jsgraph()->Int32Constant(1); // value != +0.0, -0.0, NaN |
} |
case IrOpcode::kHeapConstant: { |
- Handle<Object> handle = OpParameter<Unique<Object> >(node).handle(); |
- DCHECK(*handle == isolate()->heap()->true_value() || |
- *handle == isolate()->heap()->false_value()); |
- return jsgraph()->Int32Constant( |
- *handle == isolate()->heap()->true_value() ? 1 : 0); |
+ Handle<Object> object = OpParameter<Unique<Object>>(node).handle(); |
+ return jsgraph()->Int32Constant(object->BooleanValue() ? 1 : 0); |
} |
default: |
break; |
@@ -316,15 +315,28 @@ class RepresentationChanger { |
// Select the correct X -> Bit operator. |
const Operator* op; |
if (output_type & rWord) { |
- return node; // No change necessary. |
+ op = simplified()->ChangeWord32ToBit(); |
} else if (output_type & kRepWord64) { |
- return node; // TODO(titzer): No change necessary, on 64-bit. |
+ op = simplified()->ChangeWord64ToBit(); |
} else if (output_type & kRepTagged) { |
- op = simplified()->ChangeBoolToBit(); |
+ Type* upper = NodeProperties::GetBounds(node).upper; |
+ if (upper->Is(Type::Boolean())) { |
+ op = simplified()->ChangeBoolToBit(); |
+ } else if (upper->Is(Type::Signed32())) { |
+ // Tagged -> Int32 -> Bit |
+ node = InsertChangeTaggedToInt32(node); |
+ op = simplified()->ChangeWord32ToBit(); |
+ } else if (upper->Is(Type::Unsigned32())) { |
+ // Tagged -> Uint32 -> Bit |
+ node = InsertChangeTaggedToUint32(node); |
+ op = simplified()->ChangeWord32ToBit(); |
+ } else { |
+ return TypeError(node, output_type, kRepBit); |
+ } |
} else { |
return TypeError(node, output_type, kRepBit); |
} |
- return jsgraph()->graph()->NewNode(op, node); |
+ return graph()->NewNode(op, node); |
} |
Node* GetWord64RepresentationFor(Node* node, MachineTypeUnion output_type) { |
@@ -429,6 +441,7 @@ class RepresentationChanger { |
JSGraph* jsgraph_; |
SimplifiedOperatorBuilder* simplified_; |
Isolate* isolate_; |
+ Type* bit_range_; |
friend class RepresentationChangerTester; // accesses the below fields. |
@@ -455,19 +468,26 @@ class RepresentationChanger { |
} |
Node* InsertChangeFloat32ToFloat64(Node* node) { |
- return jsgraph()->graph()->NewNode(machine()->ChangeFloat32ToFloat64(), |
- node); |
+ return graph()->NewNode(machine()->ChangeFloat32ToFloat64(), node); |
} |
Node* InsertChangeTaggedToFloat64(Node* node) { |
- return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(), |
- node); |
+ return graph()->NewNode(simplified()->ChangeTaggedToFloat64(), node); |
+ } |
+ |
+ Node* InsertChangeTaggedToInt32(Node* node) { |
+ return graph()->NewNode(simplified()->ChangeTaggedToInt32(), node); |
+ } |
+ |
+ Node* InsertChangeTaggedToUint32(Node* node) { |
+ return graph()->NewNode(simplified()->ChangeTaggedToUint32(), node); |
} |
- JSGraph* jsgraph() { return jsgraph_; } |
- Isolate* isolate() { return isolate_; } |
- SimplifiedOperatorBuilder* simplified() { return simplified_; } |
- MachineOperatorBuilder* machine() { return jsgraph()->machine(); } |
+ Graph* graph() const { return jsgraph()->graph(); } |
+ JSGraph* jsgraph() const { return jsgraph_; } |
+ Isolate* isolate() const { return isolate_; } |
+ SimplifiedOperatorBuilder* simplified() const { return simplified_; } |
+ MachineOperatorBuilder* machine() const { return jsgraph()->machine(); } |
}; |
} // namespace compiler |