OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits> | 5 #include <limits> |
6 | 6 |
7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
8 #include "src/compiler/change-lowering.h" | 8 #include "src/compiler/change-lowering.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/graph-reducer.h" | 10 #include "src/compiler/graph-reducer.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 // TODO(titzer): factor these tests out to test-run-simplifiedops.cc. | 94 // TODO(titzer): factor these tests out to test-run-simplifiedops.cc. |
95 // TODO(titzer): test tagged representation for input to NumberToInt32. | 95 // TODO(titzer): test tagged representation for input to NumberToInt32. |
96 TEST(RunNumberToInt32_float64) { | 96 TEST(RunNumberToInt32_float64) { |
97 // TODO(titzer): explicit load/stores here are only because of representations | 97 // TODO(titzer): explicit load/stores here are only because of representations |
98 double input; | 98 double input; |
99 int32_t result; | 99 int32_t result; |
100 SimplifiedLoweringTester<Object*> t; | 100 SimplifiedLoweringTester<Object*> t; |
101 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), | 101 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), |
102 kMachFloat64}; | 102 kMachFloat64}; |
103 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); | 103 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); |
104 NodeProperties::SetBounds(loaded, Bounds(Type::Number())); | 104 NodeProperties::SetType(loaded, Type::Number()); |
105 Node* convert = t.NumberToInt32(loaded); | 105 Node* convert = t.NumberToInt32(loaded); |
106 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Signed32(), | 106 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Signed32(), |
107 kMachInt32}; | 107 kMachInt32}; |
108 t.StoreField(store, t.PointerConstant(&result), convert); | 108 t.StoreField(store, t.PointerConstant(&result), convert); |
109 t.Return(t.jsgraph.TrueConstant()); | 109 t.Return(t.jsgraph.TrueConstant()); |
110 t.LowerAllNodes(); | 110 t.LowerAllNodes(); |
111 t.GenerateCode(); | 111 t.GenerateCode(); |
112 | 112 |
113 FOR_FLOAT64_INPUTS(i) { | 113 FOR_FLOAT64_INPUTS(i) { |
114 input = *i; | 114 input = *i; |
115 int32_t expected = DoubleToInt32(*i); | 115 int32_t expected = DoubleToInt32(*i); |
116 t.Call(); | 116 t.Call(); |
117 CHECK_EQ(expected, result); | 117 CHECK_EQ(expected, result); |
118 } | 118 } |
119 } | 119 } |
120 | 120 |
121 | 121 |
122 // TODO(titzer): test tagged representation for input to NumberToUint32. | 122 // TODO(titzer): test tagged representation for input to NumberToUint32. |
123 TEST(RunNumberToUint32_float64) { | 123 TEST(RunNumberToUint32_float64) { |
124 // TODO(titzer): explicit load/stores here are only because of representations | 124 // TODO(titzer): explicit load/stores here are only because of representations |
125 double input; | 125 double input; |
126 uint32_t result; | 126 uint32_t result; |
127 SimplifiedLoweringTester<Object*> t; | 127 SimplifiedLoweringTester<Object*> t; |
128 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), | 128 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), |
129 kMachFloat64}; | 129 kMachFloat64}; |
130 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); | 130 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); |
131 NodeProperties::SetBounds(loaded, Bounds(Type::Number())); | 131 NodeProperties::SetType(loaded, Type::Number()); |
132 Node* convert = t.NumberToUint32(loaded); | 132 Node* convert = t.NumberToUint32(loaded); |
133 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Unsigned32(), | 133 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Unsigned32(), |
134 kMachUint32}; | 134 kMachUint32}; |
135 t.StoreField(store, t.PointerConstant(&result), convert); | 135 t.StoreField(store, t.PointerConstant(&result), convert); |
136 t.Return(t.jsgraph.TrueConstant()); | 136 t.Return(t.jsgraph.TrueConstant()); |
137 t.LowerAllNodes(); | 137 t.LowerAllNodes(); |
138 t.GenerateCode(); | 138 t.GenerateCode(); |
139 | 139 |
140 FOR_FLOAT64_INPUTS(i) { | 140 FOR_FLOAT64_INPUTS(i) { |
141 input = *i; | 141 input = *i; |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 start = graph()->NewNode(common()->Start(2)); | 680 start = graph()->NewNode(common()->Start(2)); |
681 graph()->SetStart(start); | 681 graph()->SetStart(start); |
682 ret = | 682 ret = |
683 graph()->NewNode(common()->Return(), jsgraph.Constant(0), start, start); | 683 graph()->NewNode(common()->Return(), jsgraph.Constant(0), start, start); |
684 end = graph()->NewNode(common()->End(1), ret); | 684 end = graph()->NewNode(common()->End(1), ret); |
685 graph()->SetEnd(end); | 685 graph()->SetEnd(end); |
686 p0 = graph()->NewNode(common()->Parameter(0), start); | 686 p0 = graph()->NewNode(common()->Parameter(0), start); |
687 p1 = graph()->NewNode(common()->Parameter(1), start); | 687 p1 = graph()->NewNode(common()->Parameter(1), start); |
688 p2 = graph()->NewNode(common()->Parameter(2), start); | 688 p2 = graph()->NewNode(common()->Parameter(2), start); |
689 typer.Run(); | 689 typer.Run(); |
690 NodeProperties::SetBounds(p0, Bounds(p0_type)); | 690 NodeProperties::SetType(p0, p0_type); |
691 NodeProperties::SetBounds(p1, Bounds(p1_type)); | 691 NodeProperties::SetType(p1, p1_type); |
692 NodeProperties::SetBounds(p2, Bounds(p2_type)); | 692 NodeProperties::SetType(p2, p2_type); |
693 } | 693 } |
694 | 694 |
695 void CheckLoweringBinop(IrOpcode::Value expected, const Operator* op) { | 695 void CheckLoweringBinop(IrOpcode::Value expected, const Operator* op) { |
696 Node* node = Return(graph()->NewNode(op, p0, p1)); | 696 Node* node = Return(graph()->NewNode(op, p0, p1)); |
697 Lower(); | 697 Lower(); |
698 CHECK_EQ(expected, node->opcode()); | 698 CHECK_EQ(expected, node->opcode()); |
699 } | 699 } |
700 | 700 |
701 void CheckLoweringTruncatedBinop(IrOpcode::Value expected, const Operator* op, | 701 void CheckLoweringTruncatedBinop(IrOpcode::Value expected, const Operator* op, |
702 const Operator* trunc) { | 702 const Operator* trunc) { |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 t.Lower(); | 1113 t.Lower(); |
1114 CheckChangeOf(IrOpcode::kChangeTaggedToUint32, t.p0, use->InputAt(0)); | 1114 CheckChangeOf(IrOpcode::kChangeTaggedToUint32, t.p0, use->InputAt(0)); |
1115 } | 1115 } |
1116 | 1116 |
1117 | 1117 |
1118 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32) { | 1118 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32) { |
1119 // NumberToUint32(x: kRepFloat64) used as kMachUint32 | 1119 // NumberToUint32(x: kRepFloat64) used as kMachUint32 |
1120 TestingGraph t(Type::Number()); | 1120 TestingGraph t(Type::Number()); |
1121 Node* p0 = t.ExampleWithOutput(kMachFloat64); | 1121 Node* p0 = t.ExampleWithOutput(kMachFloat64); |
1122 // TODO(titzer): run the typer here, or attach machine type to param. | 1122 // TODO(titzer): run the typer here, or attach machine type to param. |
1123 NodeProperties::SetBounds(p0, Bounds(Type::Number())); | 1123 NodeProperties::SetType(p0, Type::Number()); |
1124 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), p0); | 1124 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), p0); |
1125 Node* use = t.Use(trunc, kMachUint32); | 1125 Node* use = t.Use(trunc, kMachUint32); |
1126 t.Return(use); | 1126 t.Return(use); |
1127 t.Lower(); | 1127 t.Lower(); |
1128 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0)); | 1128 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0)); |
1129 } | 1129 } |
1130 | 1130 |
1131 | 1131 |
1132 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_with_change) { | 1132 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_with_change) { |
1133 // NumberToInt32(x: kTypeNumber | kRepTagged) used as kMachUint32 | 1133 // NumberToInt32(x: kTypeNumber | kRepTagged) used as kMachUint32 |
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1974 TestingGraph t(d.arg1, d.arg2, Type::Boolean()); | 1974 TestingGraph t(d.arg1, d.arg2, Type::Boolean()); |
1975 | 1975 |
1976 Node* br = t.graph()->NewNode(t.common()->Branch(), t.p2, t.start); | 1976 Node* br = t.graph()->NewNode(t.common()->Branch(), t.p2, t.start); |
1977 Node* tb = t.graph()->NewNode(t.common()->IfTrue(), br); | 1977 Node* tb = t.graph()->NewNode(t.common()->IfTrue(), br); |
1978 Node* fb = t.graph()->NewNode(t.common()->IfFalse(), br); | 1978 Node* fb = t.graph()->NewNode(t.common()->IfFalse(), br); |
1979 Node* m = t.graph()->NewNode(t.common()->Merge(2), tb, fb); | 1979 Node* m = t.graph()->NewNode(t.common()->Merge(2), tb, fb); |
1980 | 1980 |
1981 Node* phi = | 1981 Node* phi = |
1982 t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), t.p0, t.p1, m); | 1982 t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), t.p0, t.p1, m); |
1983 | 1983 |
1984 Bounds phi_bounds = Bounds::Either(Bounds(d.arg1), Bounds(d.arg2), z); | 1984 Type* phi_type = Type::Union(d.arg1, d.arg2, z); |
1985 NodeProperties::SetBounds(phi, phi_bounds); | 1985 NodeProperties::SetType(phi, phi_type); |
1986 | 1986 |
1987 Node* use = t.Use(phi, d.use); | 1987 Node* use = t.Use(phi, d.use); |
1988 t.Return(use); | 1988 t.Return(use); |
1989 t.Lower(); | 1989 t.Lower(); |
1990 | 1990 |
1991 CHECK_EQ(d.expected, OpParameter<MachineType>(phi)); | 1991 CHECK_EQ(d.expected, OpParameter<MachineType>(phi)); |
1992 } | 1992 } |
1993 } | 1993 } |
OLD | NEW |