| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 "src/compiler/int64-lowering.h" | 5 #include "src/compiler/int64-lowering.h" |
| 6 #include "src/compiler/common-operator.h" | 6 #include "src/compiler/common-operator.h" |
| 7 #include "src/compiler/linkage.h" | 7 #include "src/compiler/linkage.h" |
| 8 #include "src/compiler/machine-operator.h" | 8 #include "src/compiler/machine-operator.h" |
| 9 #include "src/compiler/node.h" | 9 #include "src/compiler/node.h" |
| 10 | 10 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 int64_t value_[3]; | 116 int64_t value_[3]; |
| 117 }; | 117 }; |
| 118 | 118 |
| 119 TEST_F(Int64LoweringTest, Int64Constant) { | 119 TEST_F(Int64LoweringTest, Int64Constant) { |
| 120 LowerGraph(Int64Constant(value(0)), MachineRepresentation::kWord64); | 120 LowerGraph(Int64Constant(value(0)), MachineRepresentation::kWord64); |
| 121 EXPECT_THAT(graph()->end()->InputAt(1), | 121 EXPECT_THAT(graph()->end()->InputAt(1), |
| 122 IsReturn2(IsInt32Constant(low_word_value(0)), | 122 IsReturn2(IsInt32Constant(low_word_value(0)), |
| 123 IsInt32Constant(high_word_value(0)), start(), start())); | 123 IsInt32Constant(high_word_value(0)), start(), start())); |
| 124 } | 124 } |
| 125 | 125 |
| 126 TEST_F(Int64LoweringTest, Int64Load) { | |
| 127 int32_t base = 0x1234; | |
| 128 int32_t index = 0x5678; | |
| 129 | |
| 130 LowerGraph(graph()->NewNode(machine()->Load(MachineType::Int64()), | |
| 131 Int32Constant(base), Int32Constant(index), | |
| 132 start(), start()), | |
| 133 MachineRepresentation::kWord64); | |
| 134 | |
| 135 Capture<Node*> high_word_load; | |
| 136 #if defined(V8_TARGET_LITTLE_ENDIAN) | 126 #if defined(V8_TARGET_LITTLE_ENDIAN) |
| 137 Matcher<Node*> high_word_load_matcher = | 127 #define LOAD_VERIFY(kLoad) \ |
| 138 IsLoad(MachineType::Int32(), IsInt32Constant(base), | 128 Matcher<Node*> high_word_load_matcher = \ |
| 139 IsInt32Add(IsInt32Constant(index), IsInt32Constant(0x4)), start(), | 129 Is##kLoad(MachineType::Int32(), IsInt32Constant(base), \ |
| 140 start()); | 130 IsInt32Add(IsInt32Constant(index), IsInt32Constant(0x4)), \ |
| 141 | 131 start(), start()); \ |
| 142 EXPECT_THAT( | 132 \ |
| 143 graph()->end()->InputAt(1), | 133 EXPECT_THAT( \ |
| 144 IsReturn2(IsLoad(MachineType::Int32(), IsInt32Constant(base), | 134 graph()->end()->InputAt(1), \ |
| 145 IsInt32Constant(index), AllOf(CaptureEq(&high_word_load), | 135 IsReturn2( \ |
| 146 high_word_load_matcher), | 136 Is##kLoad(MachineType::Int32(), IsInt32Constant(base), \ |
| 147 start()), | 137 IsInt32Constant(index), \ |
| 148 AllOf(CaptureEq(&high_word_load), high_word_load_matcher), | 138 AllOf(CaptureEq(&high_word_load), high_word_load_matcher), \ |
| 149 start(), start())); | 139 start()), \ |
| 140 AllOf(CaptureEq(&high_word_load), high_word_load_matcher), start(), \ |
| 141 start())); |
| 150 #elif defined(V8_TARGET_BIG_ENDIAN) | 142 #elif defined(V8_TARGET_BIG_ENDIAN) |
| 151 Matcher<Node*> high_word_load_matcher = | 143 #define LOAD_VERIFY(kLoad) \ |
| 152 IsLoad(MachineType::Int32(), IsInt32Constant(base), | 144 Matcher<Node*> high_word_load_matcher = \ |
| 153 IsInt32Constant(index), start(), start()); | 145 Is##kLoad(MachineType::Int32(), IsInt32Constant(base), \ |
| 154 | 146 IsInt32Constant(index), start(), start()); \ |
| 155 EXPECT_THAT( | 147 \ |
| 156 graph()->end()->InputAt(1), | 148 EXPECT_THAT( \ |
| 157 IsReturn2( | 149 graph()->end()->InputAt(1), \ |
| 158 IsLoad(MachineType::Int32(), IsInt32Constant(base), | 150 IsReturn2( \ |
| 159 IsInt32Add(IsInt32Constant(index), IsInt32Constant(0x4)), | 151 Is##kLoad(MachineType::Int32(), IsInt32Constant(base), \ |
| 160 AllOf(CaptureEq(&high_word_load), high_word_load_matcher), | 152 IsInt32Add(IsInt32Constant(index), IsInt32Constant(0x4)), \ |
| 161 start()), | 153 AllOf(CaptureEq(&high_word_load), high_word_load_matcher), \ |
| 162 AllOf(CaptureEq(&high_word_load), high_word_load_matcher), start(), | 154 start()), \ |
| 155 AllOf(CaptureEq(&high_word_load), high_word_load_matcher), start(), \ |
| 163 start())); | 156 start())); |
| 164 #endif | 157 #endif |
| 158 |
| 159 #define INT64_LOAD_LOWERING(kLoad) \ |
| 160 int32_t base = 0x1234; \ |
| 161 int32_t index = 0x5678; \ |
| 162 \ |
| 163 LowerGraph(graph()->NewNode(machine()->kLoad(MachineType::Int64()), \ |
| 164 Int32Constant(base), Int32Constant(index), \ |
| 165 start(), start()), \ |
| 166 MachineRepresentation::kWord64); \ |
| 167 \ |
| 168 Capture<Node*> high_word_load; \ |
| 169 LOAD_VERIFY(kLoad) |
| 170 |
| 171 TEST_F(Int64LoweringTest, Int64Load) { INT64_LOAD_LOWERING(Load); } |
| 172 |
| 173 TEST_F(Int64LoweringTest, UnalignedInt64Load) { |
| 174 INT64_LOAD_LOWERING(UnalignedLoad); |
| 165 } | 175 } |
| 166 | 176 |
| 177 #if defined(V8_TARGET_LITTLE_ENDIAN) |
| 178 #define STORE_VERIFY(kStore, kRep) \ |
| 179 EXPECT_THAT( \ |
| 180 graph()->end()->InputAt(1), \ |
| 181 IsReturn(IsInt32Constant(return_value), \ |
| 182 Is##kStore( \ |
| 183 kRep, IsInt32Constant(base), IsInt32Constant(index), \ |
| 184 IsInt32Constant(low_word_value(0)), \ |
| 185 Is##kStore( \ |
| 186 kRep, IsInt32Constant(base), \ |
| 187 IsInt32Add(IsInt32Constant(index), IsInt32Constant(4)), \ |
| 188 IsInt32Constant(high_word_value(0)), start(), start()), \ |
| 189 start()), \ |
| 190 start())); |
| 191 #elif defined(V8_TARGET_BIG_ENDIAN) |
| 192 #define STORE_VERIFY(kStore, kRep) \ |
| 193 EXPECT_THAT( \ |
| 194 graph()->end()->InputAt(1), \ |
| 195 IsReturn(IsInt32Constant(return_value), \ |
| 196 Is##kStore( \ |
| 197 kRep, IsInt32Constant(base), \ |
| 198 IsInt32Add(IsInt32Constant(index), IsInt32Constant(4)), \ |
| 199 IsInt32Constant(low_word_value(0)), \ |
| 200 Is##kStore( \ |
| 201 kRep, IsInt32Constant(base), IsInt32Constant(index), \ |
| 202 IsInt32Constant(high_word_value(0)), start(), start()), \ |
| 203 start()), \ |
| 204 start())); |
| 205 #endif |
| 206 |
| 207 #define INT64_STORE_LOWERING(kStore, kRep32, kRep64) \ |
| 208 int32_t base = 1111; \ |
| 209 int32_t index = 2222; \ |
| 210 int32_t return_value = 0x5555; \ |
| 211 \ |
| 212 Signature<MachineRepresentation>::Builder sig_builder(zone(), 1, 0); \ |
| 213 sig_builder.AddReturn(MachineRepresentation::kWord32); \ |
| 214 \ |
| 215 Node* store = graph()->NewNode(machine()->kStore(kRep64), \ |
| 216 Int32Constant(base), Int32Constant(index), \ |
| 217 Int64Constant(value(0)), start(), start()); \ |
| 218 \ |
| 219 Node* ret = graph()->NewNode(common()->Return(), \ |
| 220 Int32Constant(return_value), store, start()); \ |
| 221 \ |
| 222 NodeProperties::MergeControlToEnd(graph(), common(), ret); \ |
| 223 \ |
| 224 Int64Lowering lowering(graph(), machine(), common(), zone(), \ |
| 225 sig_builder.Build()); \ |
| 226 lowering.LowerGraph(); \ |
| 227 \ |
| 228 STORE_VERIFY(kStore, kRep32) |
| 229 |
| 167 TEST_F(Int64LoweringTest, Int64Store) { | 230 TEST_F(Int64LoweringTest, Int64Store) { |
| 168 // We have to build the TF graph explicitly here because Store does not return | 231 const StoreRepresentation rep64(MachineRepresentation::kWord64, |
| 169 // a value. | 232 WriteBarrierKind::kNoWriteBarrier); |
| 233 const StoreRepresentation rep32(MachineRepresentation::kWord32, |
| 234 WriteBarrierKind::kNoWriteBarrier); |
| 235 INT64_STORE_LOWERING(Store, rep32, rep64); |
| 236 } |
| 170 | 237 |
| 171 int32_t base = 1111; | 238 TEST_F(Int64LoweringTest, Int64UnalignedStore) { |
| 172 int32_t index = 2222; | 239 const UnalignedStoreRepresentation rep64(MachineRepresentation::kWord64); |
| 173 int32_t return_value = 0x5555; | 240 const UnalignedStoreRepresentation rep32(MachineRepresentation::kWord32); |
| 174 | 241 INT64_STORE_LOWERING(UnalignedStore, rep32, rep64); |
| 175 Signature<MachineRepresentation>::Builder sig_builder(zone(), 1, 0); | |
| 176 sig_builder.AddReturn(MachineRepresentation::kWord32); | |
| 177 | |
| 178 Node* store = graph()->NewNode( | |
| 179 machine()->Store(StoreRepresentation(MachineRepresentation::kWord64, | |
| 180 WriteBarrierKind::kNoWriteBarrier)), | |
| 181 Int32Constant(base), Int32Constant(index), Int64Constant(value(0)), | |
| 182 start(), start()); | |
| 183 | |
| 184 Node* ret = graph()->NewNode(common()->Return(), Int32Constant(return_value), | |
| 185 store, start()); | |
| 186 | |
| 187 NodeProperties::MergeControlToEnd(graph(), common(), ret); | |
| 188 | |
| 189 Int64Lowering lowering(graph(), machine(), common(), zone(), | |
| 190 sig_builder.Build()); | |
| 191 lowering.LowerGraph(); | |
| 192 | |
| 193 const StoreRepresentation rep(MachineRepresentation::kWord32, | |
| 194 kNoWriteBarrier); | |
| 195 | |
| 196 #if defined(V8_TARGET_LITTLE_ENDIAN) | |
| 197 EXPECT_THAT( | |
| 198 graph()->end()->InputAt(1), | |
| 199 IsReturn( | |
| 200 IsInt32Constant(return_value), | |
| 201 IsStore( | |
| 202 rep, IsInt32Constant(base), IsInt32Constant(index), | |
| 203 IsInt32Constant(low_word_value(0)), | |
| 204 IsStore(rep, IsInt32Constant(base), | |
| 205 IsInt32Add(IsInt32Constant(index), IsInt32Constant(4)), | |
| 206 IsInt32Constant(high_word_value(0)), start(), start()), | |
| 207 start()), | |
| 208 start())); | |
| 209 #elif defined(V8_TARGET_BIG_ENDIAN) | |
| 210 EXPECT_THAT( | |
| 211 graph()->end()->InputAt(1), | |
| 212 IsReturn( | |
| 213 IsInt32Constant(return_value), | |
| 214 IsStore( | |
| 215 rep, IsInt32Constant(base), | |
| 216 IsInt32Add(IsInt32Constant(index), IsInt32Constant(4)), | |
| 217 IsInt32Constant(low_word_value(0)), | |
| 218 IsStore(rep, IsInt32Constant(base), IsInt32Constant(index), | |
| 219 IsInt32Constant(high_word_value(0)), start(), start()), | |
| 220 start()), | |
| 221 start())); | |
| 222 #endif | |
| 223 } | 242 } |
| 224 | 243 |
| 225 TEST_F(Int64LoweringTest, Int64And) { | 244 TEST_F(Int64LoweringTest, Int64And) { |
| 226 LowerGraph(graph()->NewNode(machine()->Word64And(), Int64Constant(value(0)), | 245 LowerGraph(graph()->NewNode(machine()->Word64And(), Int64Constant(value(0)), |
| 227 Int64Constant(value(1))), | 246 Int64Constant(value(1))), |
| 228 MachineRepresentation::kWord64); | 247 MachineRepresentation::kWord64); |
| 229 EXPECT_THAT(graph()->end()->InputAt(1), | 248 EXPECT_THAT(graph()->end()->InputAt(1), |
| 230 IsReturn2(IsWord32And(IsInt32Constant(low_word_value(0)), | 249 IsReturn2(IsWord32And(IsInt32Constant(low_word_value(0)), |
| 231 IsInt32Constant(low_word_value(1))), | 250 IsInt32Constant(low_word_value(1))), |
| 232 IsWord32And(IsInt32Constant(high_word_value(0)), | 251 IsWord32And(IsInt32Constant(high_word_value(0)), |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 Float32Constant(2.5)); | 834 Float32Constant(2.5)); |
| 816 } | 835 } |
| 817 | 836 |
| 818 TEST_F(Int64LoweringTest, I64PhiWord32) { | 837 TEST_F(Int64LoweringTest, I64PhiWord32) { |
| 819 TestPhi(this, MachineRepresentation::kWord32, Float32Constant(1), | 838 TestPhi(this, MachineRepresentation::kWord32, Float32Constant(1), |
| 820 Float32Constant(2)); | 839 Float32Constant(2)); |
| 821 } | 840 } |
| 822 } // namespace compiler | 841 } // namespace compiler |
| 823 } // namespace internal | 842 } // namespace internal |
| 824 } // namespace v8 | 843 } // namespace v8 |
| OLD | NEW |