| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 <functional> | 5 #include <functional> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/compiler/generic-node-inl.h" | 9 #include "src/compiler/generic-node-inl.h" |
| 10 #include "test/cctest/cctest.h" | 10 #include "test/cctest/cctest.h" |
| (...skipping 2654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2665 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | 2665 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); |
| 2666 int constant = 0x55555 + i; | 2666 int constant = 0x55555 + i; |
| 2667 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); | 2667 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); |
| 2668 m.Return(m.Int32Constant(constant)); | 2668 m.Return(m.Int32Constant(constant)); |
| 2669 | 2669 |
| 2670 CHECK_EQ(constant, m.Call(1, 1)); | 2670 CHECK_EQ(constant, m.Call(1, 1)); |
| 2671 } | 2671 } |
| 2672 } | 2672 } |
| 2673 | 2673 |
| 2674 | 2674 |
| 2675 template <typename Type, typename CType> | 2675 template <typename Type> |
| 2676 static void RunLoadImmIndex(MachineType rep) { | 2676 static void RunLoadImmIndex(MachineType rep) { |
| 2677 const int kNumElems = 3; | 2677 const int kNumElems = 3; |
| 2678 CType buffer[kNumElems]; | 2678 Type buffer[kNumElems]; |
| 2679 | 2679 |
| 2680 // initialize the buffer with raw data. | 2680 // initialize the buffer with raw data. |
| 2681 byte* raw = reinterpret_cast<byte*>(buffer); | 2681 byte* raw = reinterpret_cast<byte*>(buffer); |
| 2682 for (size_t i = 0; i < sizeof(buffer); i++) { | 2682 for (size_t i = 0; i < sizeof(buffer); i++) { |
| 2683 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); | 2683 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); |
| 2684 } | 2684 } |
| 2685 | 2685 |
| 2686 // Test with various large and small offsets. | 2686 // Test with various large and small offsets. |
| 2687 for (int offset = -1; offset <= 200000; offset *= -5) { | 2687 for (int offset = -1; offset <= 200000; offset *= -5) { |
| 2688 for (int i = 0; i < kNumElems; i++) { | 2688 for (int i = 0; i < kNumElems; i++) { |
| 2689 RawMachineAssemblerTester<Type> m; | 2689 RawMachineAssemblerTester<Type> m; |
| 2690 Node* base = m.PointerConstant(buffer - offset); | 2690 Node* base = m.PointerConstant(buffer - offset); |
| 2691 Node* index = m.Int32Constant((offset + i) * sizeof(buffer[0])); | 2691 Node* index = m.Int32Constant((offset + i) * sizeof(buffer[0])); |
| 2692 m.Return(m.Load(rep, base, index)); | 2692 m.Return(m.Load(rep, base, index)); |
| 2693 | 2693 |
| 2694 Type expected = buffer[i]; | 2694 Type expected = buffer[i]; |
| 2695 Type actual = static_cast<CType>(m.Call()); | 2695 Type actual = m.Call(); |
| 2696 CHECK_EQ(expected, actual); | 2696 CHECK(expected == actual); |
| 2697 printf("XXX\n"); | |
| 2698 } | 2697 } |
| 2699 } | 2698 } |
| 2700 } | 2699 } |
| 2701 | 2700 |
| 2702 | 2701 |
| 2703 TEST(RunLoadImmIndex) { | 2702 TEST(RunLoadImmIndex) { |
| 2704 RunLoadImmIndex<int8_t, uint8_t>(kMachInt8); | 2703 RunLoadImmIndex<int8_t>(kMachInt8); |
| 2705 RunLoadImmIndex<int16_t, uint16_t>(kMachInt16); | 2704 RunLoadImmIndex<uint8_t>(kMachUint8); |
| 2706 RunLoadImmIndex<int32_t, uint32_t>(kMachInt32); | 2705 RunLoadImmIndex<int16_t>(kMachInt16); |
| 2707 RunLoadImmIndex<int32_t*, int32_t*>(kMachAnyTagged); | 2706 RunLoadImmIndex<uint16_t>(kMachUint16); |
| 2707 RunLoadImmIndex<int32_t>(kMachInt32); |
| 2708 RunLoadImmIndex<uint32_t>(kMachUint32); |
| 2709 RunLoadImmIndex<int32_t*>(kMachAnyTagged); |
| 2708 | 2710 |
| 2709 // TODO(titzer): test kRepBit loads | 2711 // TODO(titzer): test kRepBit loads |
| 2710 // TODO(titzer): test kMachFloat64 loads | 2712 // TODO(titzer): test kMachFloat64 loads |
| 2711 // TODO(titzer): test various indexing modes. | 2713 // TODO(titzer): test various indexing modes. |
| 2712 } | 2714 } |
| 2713 | 2715 |
| 2714 | 2716 |
| 2715 template <typename CType> | 2717 template <typename CType> |
| 2716 static void RunLoadStore(MachineType rep) { | 2718 static void RunLoadStore(MachineType rep) { |
| 2717 const int kNumElems = 4; | 2719 const int kNumElems = 4; |
| 2718 CType buffer[kNumElems]; | 2720 CType buffer[kNumElems]; |
| 2719 | 2721 |
| 2720 for (int32_t x = 0; x < kNumElems; x++) { | 2722 for (int32_t x = 0; x < kNumElems; x++) { |
| 2721 int32_t y = kNumElems - x - 1; | 2723 int32_t y = kNumElems - x - 1; |
| 2722 // initialize the buffer with raw data. | 2724 // initialize the buffer with raw data. |
| 2723 byte* raw = reinterpret_cast<byte*>(buffer); | 2725 byte* raw = reinterpret_cast<byte*>(buffer); |
| 2724 for (size_t i = 0; i < sizeof(buffer); i++) { | 2726 for (size_t i = 0; i < sizeof(buffer); i++) { |
| 2725 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); | 2727 raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA); |
| 2726 } | 2728 } |
| 2727 | 2729 |
| 2728 RawMachineAssemblerTester<int32_t> m; | 2730 RawMachineAssemblerTester<int32_t> m; |
| 2729 int32_t OK = 0x29000 + x; | 2731 int32_t OK = 0x29000 + x; |
| 2730 Node* base = m.PointerConstant(buffer); | 2732 Node* base = m.PointerConstant(buffer); |
| 2731 Node* index0 = m.Int32Constant(x * sizeof(buffer[0])); | 2733 Node* index0 = m.Int32Constant(x * sizeof(buffer[0])); |
| 2732 Node* load = m.Load(rep, base, index0); | 2734 Node* load = m.Load(rep, base, index0); |
| 2733 Node* index1 = m.Int32Constant(y * sizeof(buffer[0])); | 2735 Node* index1 = m.Int32Constant(y * sizeof(buffer[0])); |
| 2734 m.Store(rep, base, index1, load); | 2736 m.Store(rep, base, index1, load); |
| 2735 m.Return(m.Int32Constant(OK)); | 2737 m.Return(m.Int32Constant(OK)); |
| 2736 | 2738 |
| 2737 CHECK_NE(buffer[x], buffer[y]); | 2739 CHECK(buffer[x] != buffer[y]); |
| 2738 CHECK_EQ(OK, m.Call()); | 2740 CHECK_EQ(OK, m.Call()); |
| 2739 CHECK_EQ(buffer[x], buffer[y]); | 2741 CHECK(buffer[x] == buffer[y]); |
| 2740 } | 2742 } |
| 2741 } | 2743 } |
| 2742 | 2744 |
| 2743 | 2745 |
| 2744 TEST(RunLoadStore) { | 2746 TEST(RunLoadStore) { |
| 2745 RunLoadStore<int8_t>(kMachInt8); | 2747 RunLoadStore<int8_t>(kMachInt8); |
| 2748 RunLoadStore<uint8_t>(kMachUint8); |
| 2746 RunLoadStore<int16_t>(kMachInt16); | 2749 RunLoadStore<int16_t>(kMachInt16); |
| 2750 RunLoadStore<uint16_t>(kMachUint16); |
| 2747 RunLoadStore<int32_t>(kMachInt32); | 2751 RunLoadStore<int32_t>(kMachInt32); |
| 2752 RunLoadStore<uint32_t>(kMachUint32); |
| 2748 RunLoadStore<void*>(kMachAnyTagged); | 2753 RunLoadStore<void*>(kMachAnyTagged); |
| 2749 RunLoadStore<double>(kMachFloat64); | 2754 RunLoadStore<double>(kMachFloat64); |
| 2750 } | 2755 } |
| 2751 | 2756 |
| 2752 | 2757 |
| 2753 TEST(RunFloat64Binop) { | 2758 TEST(RunFloat64Binop) { |
| 2754 RawMachineAssemblerTester<int32_t> m; | 2759 RawMachineAssemblerTester<int32_t> m; |
| 2755 double result; | 2760 double result; |
| 2756 | 2761 |
| 2757 Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(), | 2762 Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(), |
| (...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3785 const IntType max = std::numeric_limits<IntType>::max(); | 3790 const IntType max = std::numeric_limits<IntType>::max(); |
| 3786 const IntType min = std::numeric_limits<IntType>::min(); | 3791 const IntType min = std::numeric_limits<IntType>::min(); |
| 3787 | 3792 |
| 3788 // Test upper bound. | 3793 // Test upper bound. |
| 3789 input = max; | 3794 input = max; |
| 3790 CHECK_EQ(max + 1, m.Call()); | 3795 CHECK_EQ(max + 1, m.Call()); |
| 3791 CHECK_EQ(min, input); | 3796 CHECK_EQ(min, input); |
| 3792 | 3797 |
| 3793 // Test lower bound. | 3798 // Test lower bound. |
| 3794 input = min; | 3799 input = min; |
| 3795 CHECK_EQ(max + 2, m.Call()); | 3800 CHECK_EQ(static_cast<IntType>(max + 2), m.Call()); |
| 3796 CHECK_EQ(min + 1, input); | 3801 CHECK_EQ(min + 1, input); |
| 3797 | 3802 |
| 3798 // Test all one byte values that are not one byte bounds. | 3803 // Test all one byte values that are not one byte bounds. |
| 3799 for (int i = -127; i < 127; i++) { | 3804 for (int i = -127; i < 127; i++) { |
| 3800 input = i; | 3805 input = i; |
| 3801 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; | 3806 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; |
| 3802 CHECK_EQ(expected, m.Call()); | 3807 CHECK_EQ(static_cast<IntType>(expected), m.Call()); |
| 3803 CHECK_EQ(i + 1, input); | 3808 CHECK_EQ(static_cast<IntType>(i + 1), input); |
| 3804 } | 3809 } |
| 3805 } | 3810 } |
| 3806 | 3811 |
| 3807 | 3812 |
| 3808 TEST(RunLoadStoreTruncation) { | 3813 TEST(RunLoadStoreTruncation) { |
| 3809 LoadStoreTruncation<int8_t, kMachInt8>(); | 3814 LoadStoreTruncation<int8_t, kMachInt8>(); |
| 3810 LoadStoreTruncation<int16_t, kMachInt16>(); | 3815 LoadStoreTruncation<int16_t, kMachInt16>(); |
| 3811 } | 3816 } |
| 3812 | 3817 |
| 3813 | 3818 |
| (...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4310 RawMachineAssemblerTester<int32_t> m; | 4315 RawMachineAssemblerTester<int32_t> m; |
| 4311 m.Return(m.TruncateFloat64ToInt32(m.LoadFromPointer(&input, kMachFloat64))); | 4316 m.Return(m.TruncateFloat64ToInt32(m.LoadFromPointer(&input, kMachFloat64))); |
| 4312 for (size_t i = 0; i < ARRAY_SIZE(kValues); ++i) { | 4317 for (size_t i = 0; i < ARRAY_SIZE(kValues); ++i) { |
| 4313 input = kValues[i].from; | 4318 input = kValues[i].from; |
| 4314 uint64_t expected = static_cast<int64_t>(kValues[i].raw); | 4319 uint64_t expected = static_cast<int64_t>(kValues[i].raw); |
| 4315 CHECK_EQ(static_cast<int>(expected), m.Call()); | 4320 CHECK_EQ(static_cast<int>(expected), m.Call()); |
| 4316 } | 4321 } |
| 4317 } | 4322 } |
| 4318 | 4323 |
| 4319 #endif // V8_TURBOFAN_TARGET | 4324 #endif // V8_TURBOFAN_TARGET |
| OLD | NEW |