Index: test/unittests/compiler/int64-lowering-unittest.cc |
diff --git a/test/unittests/compiler/int64-lowering-unittest.cc b/test/unittests/compiler/int64-lowering-unittest.cc |
index 934756bf600aaf4569c6c2f84e7827dcf34ebf8a..187d857547e90e4ada87031b7c937cac9e34dbc1 100644 |
--- a/test/unittests/compiler/int64-lowering-unittest.cc |
+++ b/test/unittests/compiler/int64-lowering-unittest.cc |
@@ -123,103 +123,122 @@ TEST_F(Int64LoweringTest, Int64Constant) { |
IsInt32Constant(high_word_value(0)), start(), start())); |
} |
-TEST_F(Int64LoweringTest, Int64Load) { |
- int32_t base = 0x1234; |
- int32_t index = 0x5678; |
- |
- LowerGraph(graph()->NewNode(machine()->Load(MachineType::Int64()), |
- Int32Constant(base), Int32Constant(index), |
- start(), start()), |
- MachineRepresentation::kWord64); |
- |
- Capture<Node*> high_word_load; |
#if defined(V8_TARGET_LITTLE_ENDIAN) |
- Matcher<Node*> high_word_load_matcher = |
- IsLoad(MachineType::Int32(), IsInt32Constant(base), |
- IsInt32Add(IsInt32Constant(index), IsInt32Constant(0x4)), start(), |
- start()); |
- |
- EXPECT_THAT( |
- graph()->end()->InputAt(1), |
- IsReturn2(IsLoad(MachineType::Int32(), IsInt32Constant(base), |
- IsInt32Constant(index), AllOf(CaptureEq(&high_word_load), |
- high_word_load_matcher), |
- start()), |
- AllOf(CaptureEq(&high_word_load), high_word_load_matcher), |
- start(), start())); |
+#define LOAD_VERIFY(kLoad) \ |
+ Matcher<Node*> high_word_load_matcher = \ |
+ Is##kLoad(MachineType::Int32(), IsInt32Constant(base), \ |
+ IsInt32Add(IsInt32Constant(index), IsInt32Constant(0x4)), \ |
+ start(), start()); \ |
+ \ |
+ EXPECT_THAT( \ |
+ graph()->end()->InputAt(1), \ |
+ IsReturn2( \ |
+ Is##kLoad(MachineType::Int32(), IsInt32Constant(base), \ |
+ IsInt32Constant(index), \ |
+ AllOf(CaptureEq(&high_word_load), high_word_load_matcher), \ |
+ start()), \ |
+ AllOf(CaptureEq(&high_word_load), high_word_load_matcher), start(), \ |
+ start())); |
#elif defined(V8_TARGET_BIG_ENDIAN) |
- Matcher<Node*> high_word_load_matcher = |
- IsLoad(MachineType::Int32(), IsInt32Constant(base), |
- IsInt32Constant(index), start(), start()); |
- |
- EXPECT_THAT( |
- graph()->end()->InputAt(1), |
- IsReturn2( |
- IsLoad(MachineType::Int32(), IsInt32Constant(base), |
- IsInt32Add(IsInt32Constant(index), IsInt32Constant(0x4)), |
- AllOf(CaptureEq(&high_word_load), high_word_load_matcher), |
- start()), |
- AllOf(CaptureEq(&high_word_load), high_word_load_matcher), start(), |
+#define LOAD_VERIFY(kLoad) \ |
+ Matcher<Node*> high_word_load_matcher = \ |
+ Is##kLoad(MachineType::Int32(), IsInt32Constant(base), \ |
+ IsInt32Constant(index), start(), start()); \ |
+ \ |
+ EXPECT_THAT( \ |
+ graph()->end()->InputAt(1), \ |
+ IsReturn2( \ |
+ Is##kLoad(MachineType::Int32(), IsInt32Constant(base), \ |
+ IsInt32Add(IsInt32Constant(index), IsInt32Constant(0x4)), \ |
+ AllOf(CaptureEq(&high_word_load), high_word_load_matcher), \ |
+ start()), \ |
+ AllOf(CaptureEq(&high_word_load), high_word_load_matcher), start(), \ |
start())); |
#endif |
-} |
- |
-TEST_F(Int64LoweringTest, Int64Store) { |
- // We have to build the TF graph explicitly here because Store does not return |
- // a value. |
- |
- int32_t base = 1111; |
- int32_t index = 2222; |
- int32_t return_value = 0x5555; |
- |
- Signature<MachineRepresentation>::Builder sig_builder(zone(), 1, 0); |
- sig_builder.AddReturn(MachineRepresentation::kWord32); |
- |
- Node* store = graph()->NewNode( |
- machine()->Store(StoreRepresentation(MachineRepresentation::kWord64, |
- WriteBarrierKind::kNoWriteBarrier)), |
- Int32Constant(base), Int32Constant(index), Int64Constant(value(0)), |
- start(), start()); |
- |
- Node* ret = graph()->NewNode(common()->Return(), Int32Constant(return_value), |
- store, start()); |
- NodeProperties::MergeControlToEnd(graph(), common(), ret); |
+#define INT64_LOAD_LOWERING(kLoad) \ |
+ int32_t base = 0x1234; \ |
+ int32_t index = 0x5678; \ |
+ \ |
+ LowerGraph(graph()->NewNode(machine()->kLoad(MachineType::Int64()), \ |
+ Int32Constant(base), Int32Constant(index), \ |
+ start(), start()), \ |
+ MachineRepresentation::kWord64); \ |
+ \ |
+ Capture<Node*> high_word_load; \ |
+ LOAD_VERIFY(kLoad) |
- Int64Lowering lowering(graph(), machine(), common(), zone(), |
- sig_builder.Build()); |
- lowering.LowerGraph(); |
+TEST_F(Int64LoweringTest, Int64Load) { INT64_LOAD_LOWERING(Load); } |
- const StoreRepresentation rep(MachineRepresentation::kWord32, |
- kNoWriteBarrier); |
+TEST_F(Int64LoweringTest, UnalignedInt64Load) { |
+ INT64_LOAD_LOWERING(UnalignedLoad); |
+} |
#if defined(V8_TARGET_LITTLE_ENDIAN) |
- EXPECT_THAT( |
- graph()->end()->InputAt(1), |
- IsReturn( |
- IsInt32Constant(return_value), |
- IsStore( |
- rep, IsInt32Constant(base), IsInt32Constant(index), |
- IsInt32Constant(low_word_value(0)), |
- IsStore(rep, IsInt32Constant(base), |
- IsInt32Add(IsInt32Constant(index), IsInt32Constant(4)), |
- IsInt32Constant(high_word_value(0)), start(), start()), |
- start()), |
- start())); |
+#define STORE_VERIFY(kStore, kRep) \ |
+ EXPECT_THAT( \ |
+ graph()->end()->InputAt(1), \ |
+ IsReturn(IsInt32Constant(return_value), \ |
+ Is##kStore( \ |
+ kRep, IsInt32Constant(base), IsInt32Constant(index), \ |
+ IsInt32Constant(low_word_value(0)), \ |
+ Is##kStore( \ |
+ kRep, IsInt32Constant(base), \ |
+ IsInt32Add(IsInt32Constant(index), IsInt32Constant(4)), \ |
+ IsInt32Constant(high_word_value(0)), start(), start()), \ |
+ start()), \ |
+ start())); |
#elif defined(V8_TARGET_BIG_ENDIAN) |
- EXPECT_THAT( |
- graph()->end()->InputAt(1), |
- IsReturn( |
- IsInt32Constant(return_value), |
- IsStore( |
- rep, IsInt32Constant(base), |
- IsInt32Add(IsInt32Constant(index), IsInt32Constant(4)), |
- IsInt32Constant(low_word_value(0)), |
- IsStore(rep, IsInt32Constant(base), IsInt32Constant(index), |
- IsInt32Constant(high_word_value(0)), start(), start()), |
- start()), |
- start())); |
+#define STORE_VERIFY(kStore, kRep) \ |
+ EXPECT_THAT( \ |
+ graph()->end()->InputAt(1), \ |
+ IsReturn(IsInt32Constant(return_value), \ |
+ Is##kStore( \ |
+ kRep, IsInt32Constant(base), \ |
+ IsInt32Add(IsInt32Constant(index), IsInt32Constant(4)), \ |
+ IsInt32Constant(low_word_value(0)), \ |
+ Is##kStore( \ |
+ kRep, IsInt32Constant(base), IsInt32Constant(index), \ |
+ IsInt32Constant(high_word_value(0)), start(), start()), \ |
+ start()), \ |
+ start())); |
#endif |
+ |
+#define INT64_STORE_LOWERING(kStore, kRep32, kRep64) \ |
+ int32_t base = 1111; \ |
+ int32_t index = 2222; \ |
+ int32_t return_value = 0x5555; \ |
+ \ |
+ Signature<MachineRepresentation>::Builder sig_builder(zone(), 1, 0); \ |
+ sig_builder.AddReturn(MachineRepresentation::kWord32); \ |
+ \ |
+ Node* store = graph()->NewNode(machine()->kStore(kRep64), \ |
+ Int32Constant(base), Int32Constant(index), \ |
+ Int64Constant(value(0)), start(), start()); \ |
+ \ |
+ Node* ret = graph()->NewNode(common()->Return(), \ |
+ Int32Constant(return_value), store, start()); \ |
+ \ |
+ NodeProperties::MergeControlToEnd(graph(), common(), ret); \ |
+ \ |
+ Int64Lowering lowering(graph(), machine(), common(), zone(), \ |
+ sig_builder.Build()); \ |
+ lowering.LowerGraph(); \ |
+ \ |
+ STORE_VERIFY(kStore, kRep32) |
+ |
+TEST_F(Int64LoweringTest, Int64Store) { |
+ const StoreRepresentation rep64(MachineRepresentation::kWord64, |
+ WriteBarrierKind::kNoWriteBarrier); |
+ const StoreRepresentation rep32(MachineRepresentation::kWord32, |
+ WriteBarrierKind::kNoWriteBarrier); |
+ INT64_STORE_LOWERING(Store, rep32, rep64); |
+} |
+ |
+TEST_F(Int64LoweringTest, Int64UnalignedStore) { |
+ const UnalignedStoreRepresentation rep64(MachineRepresentation::kWord64); |
+ const UnalignedStoreRepresentation rep32(MachineRepresentation::kWord32); |
+ INT64_STORE_LOWERING(UnalignedStore, rep32, rep64); |
} |
TEST_F(Int64LoweringTest, Int64And) { |