Index: test/cctest/compiler/test-simplified-lowering.cc |
diff --git a/test/cctest/compiler/test-simplified-lowering.cc b/test/cctest/compiler/test-simplified-lowering.cc |
index 5ddc10d0513e5ccb1e1b38ed7a6d46b92ba997db..7fe4933666ce3781f5b7c901504f7c3c1f908e3d 100644 |
--- a/test/cctest/compiler/test-simplified-lowering.cc |
+++ b/test/cctest/compiler/test-simplified-lowering.cc |
@@ -744,6 +744,17 @@ class TestingGraph : public HandleAndZoneScope, public GraphAndBuilders { |
} |
} |
+ Node* ExampleWithTypeAndRep(Type* type, MachineType mach_type) { |
+ FieldAccess access = {kUntaggedBase, 0, Handle<Name>::null(), type, |
+ mach_type}; |
+ // TODO(titzer): using loads here just to force the representation is ugly. |
+ Node* node = graph()->NewNode(simplified()->LoadField(access), |
+ jsgraph.IntPtrConstant(0), graph()->start(), |
+ graph()->start()); |
+ NodeProperties::SetBounds(node, Bounds(type)); |
+ return node; |
+ } |
+ |
Node* Use(Node* node, MachineType type) { |
if (type & kTypeInt32) { |
return graph()->NewNode(machine()->Int32LessThan(), node, |
@@ -757,6 +768,9 @@ class TestingGraph : public HandleAndZoneScope, public GraphAndBuilders { |
} else if (type & kRepWord64) { |
return graph()->NewNode(machine()->Int64LessThan(), node, |
Int64Constant(1)); |
+ } else if (type & kRepWord32) { |
+ return graph()->NewNode(machine()->Word32Equal(), node, |
+ jsgraph.Int32Constant(1)); |
} else { |
return graph()->NewNode(simplified()->ReferenceEqual(Type::Any()), node, |
jsgraph.TrueConstant()); |
@@ -1060,9 +1074,7 @@ TEST(LowerNumberToInt32_to_ChangeTaggedToInt32) { |
TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32) { |
// NumberToInt32(x: kRepFloat64) used as kMachInt32 |
TestingGraph t(Type::Number()); |
- Node* p0 = t.ExampleWithOutput(kMachFloat64); |
- // TODO(titzer): run the typer here, or attach machine type to param. |
- NodeProperties::SetBounds(p0, Bounds(Type::Number())); |
+ Node* p0 = t.ExampleWithTypeAndRep(Type::Number(), kMachFloat64); |
Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), p0); |
Node* use = t.Use(trunc, kMachInt32); |
t.Return(use); |
@@ -1086,17 +1098,6 @@ TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32_with_change) { |
} |
-TEST(LowerNumberToInt32_to_ChangeFloat64ToTagged) { |
- // TODO(titzer): NumberToInt32(x: kRepFloat64 | kTypeInt32) used as kRepTagged |
-} |
- |
- |
-TEST(LowerNumberToInt32_to_ChangeFloat64ToInt32) { |
- // TODO(titzer): NumberToInt32(x: kRepFloat64 | kTypeInt32) used as kRepWord32 |
- // | kTypeInt32 |
-} |
- |
- |
TEST(LowerNumberToUint32_to_nop) { |
// NumberToUint32(x: kRepTagged | kTypeUint32) used as kRepTagged |
TestingGraph t(Type::Unsigned32()); |
@@ -1159,20 +1160,67 @@ TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_with_change) { |
} |
-TEST(LowerNumberToUint32_to_ChangeFloat64ToTagged) { |
- // TODO(titzer): NumberToUint32(x: kRepFloat64 | kTypeUint32) used as |
- // kRepTagged |
+TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_uint32) { |
+ // NumberToUint32(x: kRepFloat64) used as kRepWord32 |
+ TestingGraph t(Type::Unsigned32()); |
+ Node* input = t.ExampleWithTypeAndRep(Type::Number(), kMachFloat64); |
+ Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), input); |
+ Node* use = t.Use(trunc, kRepWord32); |
+ t.Return(use); |
+ t.Lower(); |
+ CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, input, use->InputAt(0)); |
} |
-TEST(LowerNumberToUint32_to_ChangeFloat64ToUint32) { |
- // TODO(titzer): NumberToUint32(x: kRepFloat64 | kTypeUint32) used as |
- // kRepWord32 |
+TEST(LowerNumberToUI32_of_Float64_used_as_word32) { |
+ // NumberTo(Int,Uint)32(x: kRepFloat64 | kType(Int,Uint)32) used as |
+ // kType(Int,Uint)32 | kRepWord32 |
+ Type* types[] = {Type::Signed32(), Type::Unsigned32()}; |
+ MachineType mach[] = {kTypeInt32, kTypeUint32, kMachNone}; |
+ |
+ for (int i = 0; i < 2; i++) { |
+ for (int u = 0; u < 3; u++) { |
+ TestingGraph t(types[i]); |
+ Node* input = t.ExampleWithTypeAndRep( |
+ types[i], static_cast<MachineType>(kRepFloat64 | mach[i])); |
+ const Operator* op = i == 0 ? t.simplified()->NumberToInt32() |
+ : t.simplified()->NumberToUint32(); |
+ Node* trunc = t.graph()->NewNode(op, input); |
+ Node* use = t.Use(trunc, static_cast<MachineType>(kRepWord32 | mach[u])); |
+ t.Return(use); |
+ t.Lower(); |
+ IrOpcode::Value opcode = i == 0 ? IrOpcode::kChangeFloat64ToInt32 |
+ : IrOpcode::kChangeFloat64ToUint32; |
+ CheckChangeOf(opcode, input, use->InputAt(0)); |
+ } |
+ } |
} |
-TEST(LowerNumberToUint32_to_TruncateFloat64ToUint32) { |
- // TODO(titzer): NumberToUint32(x: kRepFloat64) used as kRepWord32 |
+TEST(LowerNumberToUI32_of_Float64_used_as_tagged) { |
+ // NumberTo(Int,Uint)32(x: kRepFloat64 | kType(Int,Uint)32) used as |
+ // kType(Int,Uint)32 | kRepTagged |
+ Type* types[] = {Type::Signed32(), Type::Unsigned32(), Type::Any()}; |
+ MachineType mach[] = {kTypeInt32, kTypeUint32, kMachNone}; |
+ |
+ for (int i = 0; i < 2; i++) { |
+ for (int u = 0; u < 3; u++) { |
+ TestingGraph t(types[i]); |
+ Node* input = t.ExampleWithTypeAndRep( |
+ types[i], static_cast<MachineType>(kRepFloat64 | mach[i])); |
+ const Operator* op = i == 0 ? t.simplified()->NumberToInt32() |
+ : t.simplified()->NumberToUint32(); |
+ Node* trunc = t.graph()->NewNode(op, input); |
+ // TODO(titzer): we use the store here to force the representation. |
+ FieldAccess access = {kTaggedBase, 0, Handle<Name>(), types[u], |
+ static_cast<MachineType>(mach[u] | kRepTagged)}; |
+ Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, |
+ trunc, t.start, t.start); |
+ t.Effect(store); |
+ t.Lower(); |
+ CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, input, store->InputAt(2)); |
+ } |
+ } |
} |