diff options
Diffstat (limited to 'deps/v8/test/unittests/compiler/int64-lowering-unittest.cc')
-rw-r--r-- | deps/v8/test/unittests/compiler/int64-lowering-unittest.cc | 243 |
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 |