| Index: test/cctest/compiler/test-representation-change.cc
|
| diff --git a/test/cctest/compiler/test-representation-change.cc b/test/cctest/compiler/test-representation-change.cc
|
| index b49157e3d0f21ffc4a19a2c55a4a696d9ca57ee2..24e47a8f618c4b6b46b0e3eb3f649db375c909ed 100644
|
| --- a/test/cctest/compiler/test-representation-change.cc
|
| +++ b/test/cctest/compiler/test-representation-change.cc
|
| @@ -88,7 +88,6 @@ class RepresentationChangerTester : public HandleAndZoneScope,
|
| } // namespace v8::internal::compiler
|
|
|
|
|
| -// TODO(titzer): add kRepFloat32 when fully supported.
|
| static const MachineType all_reps[] = {kRepBit, kRepWord32, kRepWord64,
|
| kRepFloat32, kRepFloat64, kRepTagged};
|
|
|
| @@ -148,6 +147,13 @@ TEST(ToTagged_constant) {
|
| r.CheckNumberConstant(c, double_inputs[i]);
|
| }
|
|
|
| + for (size_t i = 0; i < arraysize(double_inputs); i++) {
|
| + volatile float fval = static_cast<float>(double_inputs[i]);
|
| + Node* n = r.jsgraph()->Float32Constant(fval);
|
| + Node* c = r.changer()->GetRepresentationFor(n, kRepFloat32, kRepTagged);
|
| + r.CheckNumberConstant(c, fval);
|
| + }
|
| +
|
| for (size_t i = 0; i < arraysize(int32_inputs); i++) {
|
| Node* n = r.jsgraph()->Int32Constant(int32_inputs[i]);
|
| Node* c = r.changer()->GetRepresentationFor(n, kRepWord32 | kTypeInt32,
|
| @@ -177,6 +183,23 @@ static void CheckChange(IrOpcode::Value expected, MachineTypeUnion from,
|
| }
|
|
|
|
|
| +static void CheckTwoChanges(IrOpcode::Value expected2,
|
| + IrOpcode::Value expected1, MachineTypeUnion from,
|
| + MachineTypeUnion to) {
|
| + RepresentationChangerTester r;
|
| +
|
| + Node* n = r.Parameter();
|
| + Node* c1 = r.changer()->GetRepresentationFor(n, from, to);
|
| +
|
| + CHECK_NE(c1, n);
|
| + CHECK_EQ(expected1, c1->opcode());
|
| + Node* c2 = c1->InputAt(0);
|
| + CHECK_NE(c2, n);
|
| + CHECK_EQ(expected2, c2->opcode());
|
| + CHECK_EQ(n, c2->InputAt(0));
|
| +}
|
| +
|
| +
|
| TEST(SingleChanges) {
|
| CheckChange(IrOpcode::kChangeBoolToBit, kRepTagged, kRepBit);
|
| CheckChange(IrOpcode::kChangeBitToBool, kRepBit, kRepTagged);
|
| @@ -202,9 +225,32 @@ TEST(SingleChanges) {
|
| kRepWord32);
|
| CheckChange(IrOpcode::kChangeFloat64ToUint32, kRepFloat64 | kTypeUint32,
|
| kRepWord32);
|
| +
|
| + // Int32,Uint32 <-> Float32 require two changes.
|
| + CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64,
|
| + IrOpcode::kTruncateFloat64ToFloat32, kRepWord32 | kTypeInt32,
|
| + kRepFloat32);
|
| + CheckTwoChanges(IrOpcode::kChangeUint32ToFloat64,
|
| + IrOpcode::kTruncateFloat64ToFloat32, kRepWord32 | kTypeUint32,
|
| + kRepFloat32);
|
| + CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64,
|
| + IrOpcode::kChangeFloat64ToInt32, kRepFloat32 | kTypeInt32,
|
| + kRepWord32);
|
| + CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64,
|
| + IrOpcode::kChangeFloat64ToUint32, kRepFloat32 | kTypeUint32,
|
| + kRepWord32);
|
| +
|
| + // Float32 <-> Tagged require two changes.
|
| + CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64,
|
| + IrOpcode::kChangeFloat64ToTagged, kRepFloat32, kRepTagged);
|
| + CheckTwoChanges(IrOpcode::kChangeTaggedToFloat64,
|
| + IrOpcode::kTruncateFloat64ToFloat32, kRepTagged, kRepFloat32);
|
| }
|
|
|
|
|
| +// TODO(titzer): test constant folding of changes between int/float
|
| +
|
| +
|
| TEST(SignednessInWord32) {
|
| RepresentationChangerTester r;
|
|
|
| @@ -215,6 +261,11 @@ TEST(SignednessInWord32) {
|
| kRepWord32 | kTypeUint32);
|
| CheckChange(IrOpcode::kChangeInt32ToFloat64, kRepWord32, kRepFloat64);
|
| CheckChange(IrOpcode::kChangeFloat64ToInt32, kRepFloat64, kRepWord32);
|
| +
|
| + CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64,
|
| + IrOpcode::kTruncateFloat64ToFloat32, kRepWord32, kRepFloat32);
|
| + CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64,
|
| + IrOpcode::kChangeFloat64ToInt32, kRepFloat32, kRepWord32);
|
| }
|
|
|
|
|
|
|