| Index: test/compiler-unittests/change-lowering-unittest.cc
|
| diff --git a/test/compiler-unittests/change-lowering-unittest.cc b/test/compiler-unittests/change-lowering-unittest.cc
|
| index 329acfff1ef57dd83852ea854aef9afe590c0626..b10ca5ff87368ab114268463c0861099d8e4e12f 100644
|
| --- a/test/compiler-unittests/change-lowering-unittest.cc
|
| +++ b/test/compiler-unittests/change-lowering-unittest.cc
|
| @@ -85,6 +85,27 @@ TARGET_TYPED_TEST(ChangeLoweringTest, ChangeBitToBool) {
|
| }
|
|
|
|
|
| +TARGET_TYPED_TEST(ChangeLoweringTest, ChangeFloat64ToTagged) {
|
| + Node* val = this->Parameter(0);
|
| + Node* node =
|
| + this->graph()->NewNode(this->simplified()->ChangeFloat64ToTagged(), val);
|
| + Reduction reduction = this->Reduce(node);
|
| + ASSERT_TRUE(reduction.Changed());
|
| +
|
| + Node* finish = reduction.replacement();
|
| + Capture<Node*> heap_number;
|
| + const int32_t kValueOffset = this->kHeapNumberValueOffset - kHeapObjectTag;
|
| + EXPECT_THAT(
|
| + finish,
|
| + IsFinish(AllOf(CaptureEq(&heap_number),
|
| + this->IsAllocateHeapNumber(IsValueEffect(val),
|
| + this->graph()->start())),
|
| + IsStore(kMachFloat64, kNoWriteBarrier, CaptureEq(&heap_number),
|
| + IsInt32Constant(kValueOffset), val,
|
| + CaptureEq(&heap_number), this->graph()->start())));
|
| +}
|
| +
|
| +
|
| TARGET_TYPED_TEST(ChangeLoweringTest, StringAdd) {
|
| Node* node = this->graph()->NewNode(this->simplified()->StringAdd(),
|
| this->Parameter(0), this->Parameter(1));
|
| @@ -121,29 +142,19 @@ TARGET_TEST_F(ChangeLowering32Test, ChangeInt32ToTagged) {
|
| const int32_t kValueOffset = kHeapNumberValueOffset - kHeapObjectTag;
|
| EXPECT_THAT(
|
| phi,
|
| - IsPhi(
|
| - IsFinish(
|
| - AllOf(
|
| - CaptureEq(&heap_number),
|
| - IsCall(
|
| - _, IsHeapConstant(
|
| - PrintableUnique<HeapObject>::CreateImmovable(
|
| - zone(), CEntryStub(isolate(), 1).GetCode())),
|
| - IsExternalConstant(ExternalReference(
|
| - Runtime::FunctionForId(Runtime::kAllocateHeapNumber),
|
| - isolate())),
|
| - IsInt32Constant(0), IsNumberConstant(0.0),
|
| - graph()->start(), CaptureEq(&if_true))),
|
| - IsStore(kMachFloat64, kNoWriteBarrier, CaptureEq(&heap_number),
|
| - IsInt32Constant(kValueOffset),
|
| - IsChangeInt32ToFloat64(val), CaptureEq(&heap_number),
|
| - CaptureEq(&if_true))),
|
| - IsProjection(
|
| - 0, AllOf(CaptureEq(&add), IsInt32AddWithOverflow(val, val))),
|
| - IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
|
| - IsIfFalse(AllOf(CaptureEq(&branch),
|
| - IsBranch(IsProjection(1, CaptureEq(&add)),
|
| - graph()->start()))))));
|
| + IsPhi(IsFinish(
|
| + AllOf(CaptureEq(&heap_number),
|
| + IsAllocateHeapNumber(_, CaptureEq(&if_true))),
|
| + IsStore(kMachFloat64, kNoWriteBarrier, CaptureEq(&heap_number),
|
| + IsInt32Constant(kValueOffset),
|
| + IsChangeInt32ToFloat64(val), CaptureEq(&heap_number),
|
| + CaptureEq(&if_true))),
|
| + IsProjection(
|
| + 0, AllOf(CaptureEq(&add), IsInt32AddWithOverflow(val, val))),
|
| + IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
|
| + IsIfFalse(AllOf(CaptureEq(&branch),
|
| + IsBranch(IsProjection(1, CaptureEq(&add)),
|
| + graph()->start()))))));
|
| }
|
|
|
|
|
| @@ -178,6 +189,34 @@ TARGET_TEST_F(ChangeLowering32Test, ChangeTaggedToFloat64) {
|
| }
|
|
|
|
|
| +TARGET_TEST_F(ChangeLowering32Test, ChangeTaggedToInt32) {
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| +
|
| + Node* val = Parameter(0);
|
| + Node* node = graph()->NewNode(simplified()->ChangeTaggedToInt32(), val);
|
| + Reduction reduction = Reduce(node);
|
| + ASSERT_TRUE(reduction.Changed());
|
| +
|
| + const int32_t kShiftAmount =
|
| + kSmiTagSize + SmiTagging<kPointerSize>::kSmiShiftSize;
|
| + const int32_t kValueOffset = kHeapNumberValueOffset - kHeapObjectTag;
|
| + Node* phi = reduction.replacement();
|
| + Capture<Node*> branch, if_true;
|
| + EXPECT_THAT(
|
| + phi,
|
| + IsPhi(IsChangeFloat64ToInt32(
|
| + IsLoad(kMachFloat64, val, IsInt32Constant(kValueOffset),
|
| + IsControlEffect(CaptureEq(&if_true)))),
|
| + IsWord32Sar(val, IsInt32Constant(kShiftAmount)),
|
| + IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
|
| + IsIfFalse(AllOf(
|
| + CaptureEq(&branch),
|
| + IsBranch(IsWord32And(val, IsInt32Constant(kSmiTagMask)),
|
| + graph()->start()))))));
|
| +}
|
| +
|
| +
|
| class ChangeLowering64Test : public ChangeLoweringTest<int64_t> {
|
| public:
|
| virtual ~ChangeLowering64Test() {}
|
| @@ -238,6 +277,35 @@ TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToFloat64) {
|
| IsIfFalse(CaptureEq(&branch)))));
|
| }
|
|
|
| +
|
| +TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToInt32) {
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| +
|
| + Node* val = Parameter(0);
|
| + Node* node = graph()->NewNode(simplified()->ChangeTaggedToInt32(), val);
|
| + Reduction reduction = Reduce(node);
|
| + ASSERT_TRUE(reduction.Changed());
|
| +
|
| + const int32_t kShiftAmount =
|
| + kSmiTagSize + SmiTagging<kPointerSize>::kSmiShiftSize;
|
| + const int32_t kValueOffset = kHeapNumberValueOffset - kHeapObjectTag;
|
| + Node* phi = reduction.replacement();
|
| + Capture<Node*> branch, if_true;
|
| + EXPECT_THAT(
|
| + phi,
|
| + IsPhi(IsChangeFloat64ToInt32(
|
| + IsLoad(kMachFloat64, val, IsInt32Constant(kValueOffset),
|
| + IsControlEffect(CaptureEq(&if_true)))),
|
| + IsConvertInt64ToInt32(
|
| + IsWord64Sar(val, IsInt32Constant(kShiftAmount))),
|
| + IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
|
| + IsIfFalse(AllOf(
|
| + CaptureEq(&branch),
|
| + IsBranch(IsWord64And(val, IsInt32Constant(kSmiTagMask)),
|
| + graph()->start()))))));
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|