summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/compiler/int64-lowering-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/compiler/int64-lowering-unittest.cc')
-rw-r--r--deps/v8/test/unittests/compiler/int64-lowering-unittest.cc243
1 files changed, 146 insertions, 97 deletions
diff --git a/deps/v8/test/unittests/compiler/int64-lowering-unittest.cc b/deps/v8/test/unittests/compiler/int64-lowering-unittest.cc
index 08f3038754..06ac524111 100644
--- a/deps/v8/test/unittests/compiler/int64-lowering-unittest.cc
+++ b/deps/v8/test/unittests/compiler/int64-lowering-unittest.cc
@@ -123,72 +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;
- 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()));
-}
+#if defined(V8_TARGET_LITTLE_ENDIAN)
+#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)
+#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
+
+#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)
+
+TEST_F(Int64LoweringTest, Int64Load) { INT64_LOAD_LOWERING(Load); }
+
+TEST_F(Int64LoweringTest, UnalignedInt64Load) {
+ INT64_LOAD_LOWERING(UnalignedLoad);
+}
+
+#if defined(V8_TARGET_LITTLE_ENDIAN)
+#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)
+#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) {
- // 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);
-
- Int64Lowering lowering(graph(), machine(), common(), zone(),
- sig_builder.Build());
- lowering.LowerGraph();
-
- const StoreRepresentation rep(MachineRepresentation::kWord32,
- kNoWriteBarrier);
+ const StoreRepresentation rep64(MachineRepresentation::kWord64,
+ WriteBarrierKind::kNoWriteBarrier);
+ const StoreRepresentation rep32(MachineRepresentation::kWord32,
+ WriteBarrierKind::kNoWriteBarrier);
+ INT64_STORE_LOWERING(Store, rep32, rep64);
+}
- 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()));
+TEST_F(Int64LoweringTest, Int64UnalignedStore) {
+ const UnalignedStoreRepresentation rep64(MachineRepresentation::kWord64);
+ const UnalignedStoreRepresentation rep32(MachineRepresentation::kWord32);
+ INT64_STORE_LOWERING(UnalignedStore, rep32, rep64);
}
TEST_F(Int64LoweringTest, Int64And) {
@@ -301,9 +351,6 @@ TEST_F(Int64LoweringTest, CallI64Parameter) {
wasm::ModuleEnv::GetI32WasmCallDescriptor(zone(), desc));
}
-// todo(ahaas): I added a list of missing instructions here to make merging
-// easier when I do them one by one.
-// kExprI64Add:
TEST_F(Int64LoweringTest, Int64Add) {
LowerGraph(graph()->NewNode(machine()->Int64Add(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -319,7 +366,7 @@ TEST_F(Int64LoweringTest, Int64Add) {
IsProjection(1, AllOf(CaptureEq(&add), add_matcher)),
start(), start()));
}
-// kExprI64Sub:
+
TEST_F(Int64LoweringTest, Int64Sub) {
LowerGraph(graph()->NewNode(machine()->Int64Sub(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -336,7 +383,6 @@ TEST_F(Int64LoweringTest, Int64Sub) {
start(), start()));
}
-// kExprI64Mul:
TEST_F(Int64LoweringTest, Int64Mul) {
LowerGraph(graph()->NewNode(machine()->Int64Mul(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -354,11 +400,6 @@ TEST_F(Int64LoweringTest, Int64Mul) {
start(), start()));
}
-// kExprI64DivS:
-// kExprI64DivU:
-// kExprI64RemS:
-// kExprI64RemU:
-// kExprI64Ior:
TEST_F(Int64LoweringTest, Int64Ior) {
LowerGraph(graph()->NewNode(machine()->Word64Or(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -371,7 +412,6 @@ TEST_F(Int64LoweringTest, Int64Ior) {
start(), start()));
}
-// kExprI64Xor:
TEST_F(Int64LoweringTest, Int64Xor) {
LowerGraph(graph()->NewNode(machine()->Word64Xor(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -383,7 +423,7 @@ TEST_F(Int64LoweringTest, Int64Xor) {
IsInt32Constant(high_word_value(1))),
start(), start()));
}
-// kExprI64Shl:
+
TEST_F(Int64LoweringTest, Int64Shl) {
LowerGraph(graph()->NewNode(machine()->Word64Shl(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -399,7 +439,7 @@ TEST_F(Int64LoweringTest, Int64Shl) {
IsProjection(1, AllOf(CaptureEq(&shl), shl_matcher)),
start(), start()));
}
-// kExprI64ShrU:
+
TEST_F(Int64LoweringTest, Int64ShrU) {
LowerGraph(graph()->NewNode(machine()->Word64Shr(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -415,7 +455,7 @@ TEST_F(Int64LoweringTest, Int64ShrU) {
IsProjection(1, AllOf(CaptureEq(&shr), shr_matcher)),
start(), start()));
}
-// kExprI64ShrS:
+
TEST_F(Int64LoweringTest, Int64ShrS) {
LowerGraph(graph()->NewNode(machine()->Word64Sar(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -431,7 +471,7 @@ TEST_F(Int64LoweringTest, Int64ShrS) {
IsProjection(1, AllOf(CaptureEq(&sar), sar_matcher)),
start(), start()));
}
-// kExprI64Eq:
+
TEST_F(Int64LoweringTest, Int64Eq) {
LowerGraph(graph()->NewNode(machine()->Word64Equal(), Int64Constant(value(0)),
Int64Constant(value(1))),
@@ -447,27 +487,25 @@ TEST_F(Int64LoweringTest, Int64Eq) {
start(), start()));
}
-// kExprI64LtS:
TEST_F(Int64LoweringTest, Int64LtS) {
TestComparison(machine()->Int64LessThan(), IsInt32LessThan, IsUint32LessThan);
}
-// kExprI64LeS:
+
TEST_F(Int64LoweringTest, Int64LeS) {
TestComparison(machine()->Int64LessThanOrEqual(), IsInt32LessThan,
IsUint32LessThanOrEqual);
}
-// kExprI64LtU:
+
TEST_F(Int64LoweringTest, Int64LtU) {
TestComparison(machine()->Uint64LessThan(), IsUint32LessThan,
IsUint32LessThan);
}
-// kExprI64LeU:
+
TEST_F(Int64LoweringTest, Int64LeU) {
TestComparison(machine()->Uint64LessThanOrEqual(), IsUint32LessThan,
IsUint32LessThanOrEqual);
}
-// kExprI32ConvertI64:
TEST_F(Int64LoweringTest, I32ConvertI64) {
LowerGraph(graph()->NewNode(machine()->TruncateInt64ToInt32(),
Int64Constant(value(0))),
@@ -475,7 +513,7 @@ TEST_F(Int64LoweringTest, I32ConvertI64) {
EXPECT_THAT(graph()->end()->InputAt(1),
IsReturn(IsInt32Constant(low_word_value(0)), start(), start()));
}
-// kExprI64SConvertI32:
+
TEST_F(Int64LoweringTest, I64SConvertI32) {
LowerGraph(graph()->NewNode(machine()->ChangeInt32ToInt64(),
Int32Constant(low_word_value(0))),
@@ -501,7 +539,7 @@ TEST_F(Int64LoweringTest, I64SConvertI32_2) {
IsInt32Constant(31)),
start(), start()));
}
-// kExprI64UConvertI32:
+
TEST_F(Int64LoweringTest, I64UConvertI32) {
LowerGraph(graph()->NewNode(machine()->ChangeUint32ToUint64(),
Int32Constant(low_word_value(0))),
@@ -523,7 +561,7 @@ TEST_F(Int64LoweringTest, I64UConvertI32_2) {
IsReturn2(IsInt32Constant(low_word_value(0)), IsInt32Constant(0),
start(), start()));
}
-// kExprF64ReinterpretI64:
+
TEST_F(Int64LoweringTest, F64ReinterpretI64) {
LowerGraph(graph()->NewNode(machine()->BitcastInt64ToFloat64(),
Int64Constant(value(0))),
@@ -538,12 +576,13 @@ TEST_F(Int64LoweringTest, F64ReinterpretI64) {
IsStore(StoreRepresentation(MachineRepresentation::kWord32,
WriteBarrierKind::kNoWriteBarrier),
AllOf(CaptureEq(&stack_slot_capture), stack_slot_matcher),
- IsInt32Constant(0), IsInt32Constant(low_word_value(0)),
+ IsInt32Constant(Int64Lowering::kLowerWordOffset),
+ IsInt32Constant(low_word_value(0)),
IsStore(StoreRepresentation(MachineRepresentation::kWord32,
WriteBarrierKind::kNoWriteBarrier),
AllOf(CaptureEq(&stack_slot_capture), stack_slot_matcher),
- IsInt32Constant(4), IsInt32Constant(high_word_value(0)),
- start(), start()),
+ IsInt32Constant(Int64Lowering::kHigherWordOffset),
+ IsInt32Constant(high_word_value(0)), start(), start()),
start());
EXPECT_THAT(
@@ -554,7 +593,7 @@ TEST_F(Int64LoweringTest, F64ReinterpretI64) {
AllOf(CaptureEq(&store_capture), store_matcher), start()),
start(), start()));
}
-// kExprI64ReinterpretF64:
+
TEST_F(Int64LoweringTest, I64ReinterpretF64) {
LowerGraph(graph()->NewNode(machine()->BitcastFloat64ToInt64(),
Float64Constant(bit_cast<double>(value(0)))),
@@ -575,15 +614,15 @@ TEST_F(Int64LoweringTest, I64ReinterpretF64) {
graph()->end()->InputAt(1),
IsReturn2(IsLoad(MachineType::Int32(),
AllOf(CaptureEq(&stack_slot), stack_slot_matcher),
- IsInt32Constant(0),
+ IsInt32Constant(Int64Lowering::kLowerWordOffset),
AllOf(CaptureEq(&store), store_matcher), start()),
IsLoad(MachineType::Int32(),
AllOf(CaptureEq(&stack_slot), stack_slot_matcher),
- IsInt32Constant(0x4),
+ IsInt32Constant(Int64Lowering::kHigherWordOffset),
AllOf(CaptureEq(&store), store_matcher), start()),
start(), start()));
}
-// kExprI64Clz:
+
TEST_F(Int64LoweringTest, I64Clz) {
LowerGraph(graph()->NewNode(machine()->Word64Clz(), Int64Constant(value(0))),
MachineRepresentation::kWord64);
@@ -606,9 +645,9 @@ TEST_F(Int64LoweringTest, I64Clz) {
AllOf(CaptureEq(&branch_capture), branch_matcher)))),
IsInt32Constant(0), start(), start()));
}
-// kExprI64Ctz:
+
TEST_F(Int64LoweringTest, I64Ctz) {
- LowerGraph(graph()->NewNode(machine()->Word64CtzPlaceholder(),
+ LowerGraph(graph()->NewNode(machine()->Word64Ctz().placeholder(),
Int64Constant(value(0))),
MachineRepresentation::kWord64);
Capture<Node*> branch_capture;
@@ -628,7 +667,6 @@ TEST_F(Int64LoweringTest, I64Ctz) {
AllOf(CaptureEq(&branch_capture), branch_matcher)))),
IsInt32Constant(0), start(), start()));
}
-// kExprI64Popcnt:
TEST_F(Int64LoweringTest, Dfs) {
Node* common = Int64Constant(value(0));
@@ -649,7 +687,7 @@ TEST_F(Int64LoweringTest, Dfs) {
}
TEST_F(Int64LoweringTest, I64Popcnt) {
- LowerGraph(graph()->NewNode(machine()->Word64PopcntPlaceholder(),
+ LowerGraph(graph()->NewNode(machine()->Word64Popcnt().placeholder(),
Int64Constant(value(0))),
MachineRepresentation::kWord64);
@@ -800,6 +838,17 @@ TEST_F(Int64LoweringTest, I64PhiWord32) {
TestPhi(this, MachineRepresentation::kWord32, Float32Constant(1),
Float32Constant(2));
}
+
+TEST_F(Int64LoweringTest, I64ReverseBytes) {
+ LowerGraph(graph()->NewNode(machine()->Word64ReverseBytes().placeholder(),
+ Int64Constant(value(0))),
+ MachineRepresentation::kWord64);
+ EXPECT_THAT(
+ graph()->end()->InputAt(1),
+ IsReturn2(IsWord32ReverseBytes(IsInt32Constant(high_word_value(0))),
+ IsWord32ReverseBytes(IsInt32Constant(low_word_value(0))),
+ start(), start()));
+}
} // namespace compiler
} // namespace internal
} // namespace v8