| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 "src/assembler.h" | 5 #include "src/assembler.h" |
| 6 #include "src/codegen.h" | 6 #include "src/codegen.h" |
| 7 #include "src/compiler/linkage.h" | 7 #include "src/compiler/linkage.h" |
| 8 #include "src/compiler/machine-type.h" | 8 #include "src/compiler/machine-type.h" |
| 9 #include "src/compiler/raw-machine-assembler.h" | 9 #include "src/compiler/raw-machine-assembler.h" |
| 10 #include "src/register-configuration.h" | |
| 11 | 10 |
| 12 #include "test/cctest/cctest.h" | 11 #include "test/cctest/cctest.h" |
| 13 #include "test/cctest/compiler/codegen-tester.h" | 12 #include "test/cctest/compiler/codegen-tester.h" |
| 14 #include "test/cctest/compiler/graph-builder-tester.h" | 13 #include "test/cctest/compiler/graph-builder-tester.h" |
| 15 #include "test/cctest/compiler/value-helper.h" | 14 #include "test/cctest/compiler/value-helper.h" |
| 16 | 15 |
| 17 using namespace v8::base; | 16 using namespace v8::base; |
| 18 using namespace v8::internal; | 17 using namespace v8::internal; |
| 19 using namespace v8::internal::compiler; | 18 using namespace v8::internal::compiler; |
| 20 | 19 |
| 21 typedef RawMachineAssembler::Label MLabel; | 20 typedef RawMachineAssembler::Label MLabel; |
| 22 | 21 |
| 23 #if V8_TARGET_ARCH_ARM64 | 22 #if V8_TARGET_ARCH_ARM64 |
| 24 // TODO(titzer): fix native stack parameters on arm64 | 23 // TODO(titzer): fix native stack parameters on arm64 |
| 25 #define DISABLE_NATIVE_STACK_PARAMS true | 24 #define DISABLE_NATIVE_STACK_PARAMS true |
| 26 #else | 25 #else |
| 27 #define DISABLE_NATIVE_STACK_PARAMS false | 26 #define DISABLE_NATIVE_STACK_PARAMS false |
| 28 #endif | 27 #endif |
| 29 | 28 |
| 30 namespace { | 29 namespace { |
| 31 typedef float float32; | 30 typedef float float32; |
| 32 typedef double float64; | 31 typedef double float64; |
| 33 | 32 |
| 34 // Picks a representative pair of integers from the given range. | 33 // Picks a representative pair of integers from the given range. |
| 35 // If there are less than {max_pairs} possible pairs, do them all, otherwise try | 34 // If there are less than {max_pairs} possible pairs, do them all, otherwise try |
| 36 // to select a representative set. | 35 // to select a representative set. |
| 37 class Pairs { | 36 class Pairs { |
| 38 public: | 37 public: |
| 39 Pairs(int max_pairs, int range, const int* codes) | 38 Pairs(int max_pairs, int range) |
| 40 : range_(range), | 39 : range_(range), |
| 41 codes_(codes), | |
| 42 max_pairs_(std::min(max_pairs, range_ * range_)), | 40 max_pairs_(std::min(max_pairs, range_ * range_)), |
| 43 counter_(0) {} | 41 counter_(0) {} |
| 44 | 42 |
| 45 bool More() { return counter_ < max_pairs_; } | 43 bool More() { return counter_ < max_pairs_; } |
| 46 | 44 |
| 47 void Next(int* r0, int* r1, bool same_is_ok) { | 45 void Next(int* r0, int* r1, bool same_is_ok) { |
| 48 do { | 46 do { |
| 49 // Find the next pair. | 47 // Find the next pair. |
| 50 if (exhaustive()) { | 48 if (exhaustive()) { |
| 51 *r0 = codes_[counter_ % range_]; | 49 *r0 = counter_ % range_; |
| 52 *r1 = codes_[counter_ / range_]; | 50 *r1 = counter_ / range_; |
| 53 } else { | 51 } else { |
| 54 // Try each integer at least once for both r0 and r1. | 52 // Try each integer at least once for both r0 and r1. |
| 55 int index = counter_ / 2; | 53 int index = counter_ / 2; |
| 56 if (counter_ & 1) { | 54 if (counter_ & 1) { |
| 57 *r0 = codes_[index % range_]; | 55 *r0 = index % range_; |
| 58 *r1 = codes_[index / range_]; | 56 *r1 = index / range_; |
| 59 } else { | 57 } else { |
| 60 *r1 = codes_[index % range_]; | 58 *r1 = index % range_; |
| 61 *r0 = codes_[index / range_]; | 59 *r0 = index / range_; |
| 62 } | 60 } |
| 63 } | 61 } |
| 64 counter_++; | 62 counter_++; |
| 65 if ((same_is_ok) || (*r0 != *r1)) break; | 63 if (same_is_ok) break; |
| 66 if (counter_ == max_pairs_) { | 64 if (*r0 == *r1) { |
| 67 // For the last hurrah, reg#0 with reg#n-1 | 65 if (counter_ >= max_pairs_) { |
| 68 *r0 = codes_[0]; | 66 // For the last hurrah, reg#0 with reg#n-1 |
| 69 *r1 = codes_[range_ - 1]; | 67 *r0 = 0; |
| 70 break; | 68 *r1 = range_ - 1; |
| 69 break; |
| 70 } |
| 71 } | 71 } |
| 72 } while (true); | 72 } while (true); |
| 73 |
| 74 DCHECK(*r0 >= 0 && *r0 < range_); |
| 75 DCHECK(*r1 >= 0 && *r1 < range_); |
| 73 } | 76 } |
| 74 | 77 |
| 75 private: | 78 private: |
| 76 int range_; | 79 int range_; |
| 77 const int* codes_; | |
| 78 int max_pairs_; | 80 int max_pairs_; |
| 79 int counter_; | 81 int counter_; |
| 80 bool exhaustive() { return max_pairs_ == (range_ * range_); } | 82 bool exhaustive() { return max_pairs_ == (range_ * range_); } |
| 81 }; | 83 }; |
| 82 | 84 |
| 83 | 85 |
| 84 // Pairs of general purpose registers. | 86 // Pairs of general purpose registers. |
| 85 class RegisterPairs : public Pairs { | 87 class RegisterPairs : public Pairs { |
| 86 public: | 88 public: |
| 87 RegisterPairs() | 89 RegisterPairs() : Pairs(100, Register::kMaxNumAllocatableRegisters) {} |
| 88 : Pairs( | |
| 89 100, RegisterConfiguration::ArchDefault() | |
| 90 ->num_allocatable_general_registers(), | |
| 91 RegisterConfiguration::ArchDefault()->allocatable_general_codes()) { | |
| 92 } | |
| 93 }; | 90 }; |
| 94 | 91 |
| 95 | 92 |
| 96 // Pairs of double registers. | 93 // Pairs of double registers. |
| 97 class Float32RegisterPairs : public Pairs { | 94 class Float32RegisterPairs : public Pairs { |
| 98 public: | 95 public: |
| 99 Float32RegisterPairs() | 96 Float32RegisterPairs() |
| 100 : Pairs( | 97 : Pairs(100, DoubleRegister::NumAllocatableAliasedRegisters()) {} |
| 101 100, RegisterConfiguration::ArchDefault() | |
| 102 ->num_allocatable_aliased_double_registers(), | |
| 103 RegisterConfiguration::ArchDefault()->allocatable_double_codes()) {} | |
| 104 }; | 98 }; |
| 105 | 99 |
| 106 | 100 |
| 107 // Pairs of double registers. | 101 // Pairs of double registers. |
| 108 class Float64RegisterPairs : public Pairs { | 102 class Float64RegisterPairs : public Pairs { |
| 109 public: | 103 public: |
| 110 Float64RegisterPairs() | 104 Float64RegisterPairs() |
| 111 : Pairs( | 105 : Pairs(100, DoubleRegister::NumAllocatableAliasedRegisters()) {} |
| 112 100, RegisterConfiguration::ArchDefault() | |
| 113 ->num_allocatable_aliased_double_registers(), | |
| 114 RegisterConfiguration::ArchDefault()->allocatable_double_codes()) {} | |
| 115 }; | 106 }; |
| 116 | 107 |
| 117 | 108 |
| 118 // Helper for allocating either an GP or FP reg, or the next stack slot. | 109 // Helper for allocating either an GP or FP reg, or the next stack slot. |
| 119 struct Allocator { | 110 struct Allocator { |
| 120 Allocator(int* gp, int gpc, int* fp, int fpc) | 111 Allocator(int* gp, int gpc, int* fp, int fpc) |
| 121 : gp_count(gpc), | 112 : gp_count(gpc), |
| 122 gp_offset(0), | 113 gp_offset(0), |
| 123 gp_regs(gp), | 114 gp_regs(gp), |
| 124 fp_count(fpc), | 115 fp_count(fpc), |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 626 Allocator params(parray, 2, nullptr, 0); | 617 Allocator params(parray, 2, nullptr, 0); |
| 627 Allocator rets(rarray, 1, nullptr, 0); | 618 Allocator rets(rarray, 1, nullptr, 0); |
| 628 RegisterConfig config(params, rets); | 619 RegisterConfig config(params, rets); |
| 629 CallDescriptor* desc = config.Create(&zone, &sig); | 620 CallDescriptor* desc = config.Create(&zone, &sig); |
| 630 TestInt32Sub(desc); | 621 TestInt32Sub(desc); |
| 631 } | 622 } |
| 632 } | 623 } |
| 633 | 624 |
| 634 | 625 |
| 635 // Separate tests for parallelization. | 626 // Separate tests for parallelization. |
| 636 #define TEST_INT32_SUB_WITH_RET(x) \ | 627 #define TEST_INT32_SUB_WITH_RET(x) \ |
| 637 TEST(Run_Int32Sub_all_allocatable_pairs_##x) { \ | 628 TEST(Run_Int32Sub_all_allocatable_pairs_##x) { \ |
| 638 if (x < Register::kNumRegisters && \ | 629 if (Register::kMaxNumAllocatableRegisters > x) Test_RunInt32SubWithRet(x); \ |
| 639 Register::from_code(x).IsAllocatable()) { \ | |
| 640 Test_RunInt32SubWithRet(x); \ | |
| 641 } \ | |
| 642 } | 630 } |
| 643 | 631 |
| 644 | 632 |
| 645 TEST_INT32_SUB_WITH_RET(0) | 633 TEST_INT32_SUB_WITH_RET(0) |
| 646 TEST_INT32_SUB_WITH_RET(1) | 634 TEST_INT32_SUB_WITH_RET(1) |
| 647 TEST_INT32_SUB_WITH_RET(2) | 635 TEST_INT32_SUB_WITH_RET(2) |
| 648 TEST_INT32_SUB_WITH_RET(3) | 636 TEST_INT32_SUB_WITH_RET(3) |
| 649 TEST_INT32_SUB_WITH_RET(4) | 637 TEST_INT32_SUB_WITH_RET(4) |
| 650 TEST_INT32_SUB_WITH_RET(5) | 638 TEST_INT32_SUB_WITH_RET(5) |
| 651 TEST_INT32_SUB_WITH_RET(6) | 639 TEST_INT32_SUB_WITH_RET(6) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 682 } | 670 } |
| 683 | 671 |
| 684 | 672 |
| 685 TEST(Run_CopyTwentyInt32_all_allocatable_pairs) { | 673 TEST(Run_CopyTwentyInt32_all_allocatable_pairs) { |
| 686 if (DISABLE_NATIVE_STACK_PARAMS) return; | 674 if (DISABLE_NATIVE_STACK_PARAMS) return; |
| 687 Int32Signature sig(20); | 675 Int32Signature sig(20); |
| 688 RegisterPairs pairs; | 676 RegisterPairs pairs; |
| 689 while (pairs.More()) { | 677 while (pairs.More()) { |
| 690 Zone zone; | 678 Zone zone; |
| 691 int parray[2]; | 679 int parray[2]; |
| 692 int rarray[] = { | 680 int rarray[] = {0}; |
| 693 RegisterConfiguration::ArchDefault()->GetAllocatableGeneralCode(0)}; | |
| 694 pairs.Next(&parray[0], &parray[1], false); | 681 pairs.Next(&parray[0], &parray[1], false); |
| 695 Allocator params(parray, 2, nullptr, 0); | 682 Allocator params(parray, 2, nullptr, 0); |
| 696 Allocator rets(rarray, 1, nullptr, 0); | 683 Allocator rets(rarray, 1, nullptr, 0); |
| 697 RegisterConfig config(params, rets); | 684 RegisterConfig config(params, rets); |
| 698 CallDescriptor* desc = config.Create(&zone, &sig); | 685 CallDescriptor* desc = config.Create(&zone, &sig); |
| 699 CopyTwentyInt32(desc); | 686 CopyTwentyInt32(desc); |
| 700 } | 687 } |
| 701 } | 688 } |
| 702 | 689 |
| 703 | 690 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 730 for (int i = 0; i < ParamCount(desc); i++) { | 717 for (int i = 0; i < ParamCount(desc); i++) { |
| 731 result += static_cast<uint32_t>(input[i]) * coeff[i]; | 718 result += static_cast<uint32_t>(input[i]) * coeff[i]; |
| 732 } | 719 } |
| 733 return static_cast<int32_t>(result); | 720 return static_cast<int32_t>(result); |
| 734 } | 721 } |
| 735 | 722 |
| 736 | 723 |
| 737 static void Test_Int32_WeightedSum_of_size(int count) { | 724 static void Test_Int32_WeightedSum_of_size(int count) { |
| 738 if (DISABLE_NATIVE_STACK_PARAMS) return; | 725 if (DISABLE_NATIVE_STACK_PARAMS) return; |
| 739 Int32Signature sig(count); | 726 Int32Signature sig(count); |
| 740 for (int p0 = 0; p0 < Register::kNumRegisters; p0++) { | 727 for (int p0 = 0; p0 < Register::kMaxNumAllocatableRegisters; p0++) { |
| 741 if (Register::from_code(p0).IsAllocatable()) { | 728 Zone zone; |
| 742 Zone zone; | |
| 743 | 729 |
| 744 int parray[] = {p0}; | 730 int parray[] = {p0}; |
| 745 int rarray[] = { | 731 int rarray[] = {0}; |
| 746 RegisterConfiguration::ArchDefault()->GetAllocatableGeneralCode(0)}; | 732 Allocator params(parray, 1, nullptr, 0); |
| 747 Allocator params(parray, 1, nullptr, 0); | 733 Allocator rets(rarray, 1, nullptr, 0); |
| 748 Allocator rets(rarray, 1, nullptr, 0); | 734 RegisterConfig config(params, rets); |
| 749 RegisterConfig config(params, rets); | 735 CallDescriptor* desc = config.Create(&zone, &sig); |
| 750 CallDescriptor* desc = config.Create(&zone, &sig); | 736 Run_Computation<int32_t>(desc, Build_Int32_WeightedSum, |
| 751 Run_Computation<int32_t>(desc, Build_Int32_WeightedSum, | 737 Compute_Int32_WeightedSum, 257 + count); |
| 752 Compute_Int32_WeightedSum, 257 + count); | |
| 753 } | |
| 754 } | 738 } |
| 755 } | 739 } |
| 756 | 740 |
| 757 | 741 |
| 758 // Separate tests for parallelization. | 742 // Separate tests for parallelization. |
| 759 #define TEST_INT32_WEIGHTEDSUM(x) \ | 743 #define TEST_INT32_WEIGHTEDSUM(x) \ |
| 760 TEST(Run_Int32_WeightedSum_##x) { Test_Int32_WeightedSum_of_size(x); } | 744 TEST(Run_Int32_WeightedSum_##x) { Test_Int32_WeightedSum_of_size(x); } |
| 761 | 745 |
| 762 | 746 |
| 763 TEST_INT32_WEIGHTEDSUM(1) | 747 TEST_INT32_WEIGHTEDSUM(1) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 791 Run_Computation<CType>(desc, Build_Select<which>, | 775 Run_Computation<CType>(desc, Build_Select<which>, |
| 792 Compute_Select<CType, which>, | 776 Compute_Select<CType, which>, |
| 793 1044 + which + 3 * sizeof(CType)); | 777 1044 + which + 3 * sizeof(CType)); |
| 794 } | 778 } |
| 795 | 779 |
| 796 | 780 |
| 797 template <int which> | 781 template <int which> |
| 798 void Test_Int32_Select() { | 782 void Test_Int32_Select() { |
| 799 if (DISABLE_NATIVE_STACK_PARAMS) return; | 783 if (DISABLE_NATIVE_STACK_PARAMS) return; |
| 800 | 784 |
| 801 int parray[] = { | 785 int parray[] = {0}; |
| 802 RegisterConfiguration::ArchDefault()->GetAllocatableGeneralCode(0)}; | 786 int rarray[] = {0}; |
| 803 int rarray[] = { | |
| 804 RegisterConfiguration::ArchDefault()->GetAllocatableGeneralCode(0)}; | |
| 805 Allocator params(parray, 1, nullptr, 0); | 787 Allocator params(parray, 1, nullptr, 0); |
| 806 Allocator rets(rarray, 1, nullptr, 0); | 788 Allocator rets(rarray, 1, nullptr, 0); |
| 807 RegisterConfig config(params, rets); | 789 RegisterConfig config(params, rets); |
| 808 | 790 |
| 809 Zone zone; | 791 Zone zone; |
| 810 | 792 |
| 811 for (int i = which + 1; i <= 64; i++) { | 793 for (int i = which + 1; i <= 64; i++) { |
| 812 Int32Signature sig(i); | 794 Int32Signature sig(i); |
| 813 CallDescriptor* desc = config.Create(&zone, &sig); | 795 CallDescriptor* desc = config.Create(&zone, &sig); |
| 814 RunSelect<int32_t, which>(desc); | 796 RunSelect<int32_t, which>(desc); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 830 TEST_INT32_SELECT(6) | 812 TEST_INT32_SELECT(6) |
| 831 TEST_INT32_SELECT(11) | 813 TEST_INT32_SELECT(11) |
| 832 TEST_INT32_SELECT(15) | 814 TEST_INT32_SELECT(15) |
| 833 TEST_INT32_SELECT(19) | 815 TEST_INT32_SELECT(19) |
| 834 TEST_INT32_SELECT(45) | 816 TEST_INT32_SELECT(45) |
| 835 TEST_INT32_SELECT(62) | 817 TEST_INT32_SELECT(62) |
| 836 TEST_INT32_SELECT(63) | 818 TEST_INT32_SELECT(63) |
| 837 | 819 |
| 838 | 820 |
| 839 TEST(Int64Select_registers) { | 821 TEST(Int64Select_registers) { |
| 840 if (RegisterConfiguration::ArchDefault() | 822 if (Register::kMaxNumAllocatableRegisters < 2) return; |
| 841 ->num_allocatable_general_registers() < 2) | |
| 842 return; | |
| 843 if (kPointerSize < 8) return; // TODO(titzer): int64 on 32-bit platforms | 823 if (kPointerSize < 8) return; // TODO(titzer): int64 on 32-bit platforms |
| 844 | 824 |
| 845 int rarray[] = { | 825 int rarray[] = {0}; |
| 846 RegisterConfiguration::ArchDefault()->GetAllocatableGeneralCode(0)}; | |
| 847 ArgsBuffer<int64_t>::Sig sig(2); | 826 ArgsBuffer<int64_t>::Sig sig(2); |
| 848 | 827 |
| 849 RegisterPairs pairs; | 828 RegisterPairs pairs; |
| 850 Zone zone; | 829 Zone zone; |
| 851 while (pairs.More()) { | 830 while (pairs.More()) { |
| 852 int parray[2]; | 831 int parray[2]; |
| 853 pairs.Next(&parray[0], &parray[1], false); | 832 pairs.Next(&parray[0], &parray[1], false); |
| 854 Allocator params(parray, 2, nullptr, 0); | 833 Allocator params(parray, 2, nullptr, 0); |
| 855 Allocator rets(rarray, 1, nullptr, 0); | 834 Allocator rets(rarray, 1, nullptr, 0); |
| 856 RegisterConfig config(params, rets); | 835 RegisterConfig config(params, rets); |
| 857 | 836 |
| 858 CallDescriptor* desc = config.Create(&zone, &sig); | 837 CallDescriptor* desc = config.Create(&zone, &sig); |
| 859 RunSelect<int64_t, 0>(desc); | 838 RunSelect<int64_t, 0>(desc); |
| 860 RunSelect<int64_t, 1>(desc); | 839 RunSelect<int64_t, 1>(desc); |
| 861 } | 840 } |
| 862 } | 841 } |
| 863 | 842 |
| 864 | 843 |
| 865 TEST(Float32Select_registers) { | 844 TEST(Float32Select_registers) { |
| 866 if (RegisterConfiguration::ArchDefault()->num_allocatable_double_registers() < | 845 if (RegisterConfiguration::ArchDefault()->num_double_registers() < 2) return; |
| 867 2) { | |
| 868 return; | |
| 869 } | |
| 870 | 846 |
| 871 int rarray[] = { | 847 int rarray[] = {0}; |
| 872 RegisterConfiguration::ArchDefault()->GetAllocatableDoubleCode(0)}; | |
| 873 ArgsBuffer<float32>::Sig sig(2); | 848 ArgsBuffer<float32>::Sig sig(2); |
| 874 | 849 |
| 875 Float32RegisterPairs pairs; | 850 Float32RegisterPairs pairs; |
| 876 Zone zone; | 851 Zone zone; |
| 877 while (pairs.More()) { | 852 while (pairs.More()) { |
| 878 int parray[2]; | 853 int parray[2]; |
| 879 pairs.Next(&parray[0], &parray[1], false); | 854 pairs.Next(&parray[0], &parray[1], false); |
| 880 Allocator params(nullptr, 0, parray, 2); | 855 Allocator params(nullptr, 0, parray, 2); |
| 881 Allocator rets(nullptr, 0, rarray, 1); | 856 Allocator rets(nullptr, 0, rarray, 1); |
| 882 RegisterConfig config(params, rets); | 857 RegisterConfig config(params, rets); |
| 883 | 858 |
| 884 CallDescriptor* desc = config.Create(&zone, &sig); | 859 CallDescriptor* desc = config.Create(&zone, &sig); |
| 885 RunSelect<float32, 0>(desc); | 860 RunSelect<float32, 0>(desc); |
| 886 RunSelect<float32, 1>(desc); | 861 RunSelect<float32, 1>(desc); |
| 887 } | 862 } |
| 888 } | 863 } |
| 889 | 864 |
| 890 | 865 |
| 891 TEST(Float64Select_registers) { | 866 TEST(Float64Select_registers) { |
| 892 if (RegisterConfiguration::ArchDefault()->num_allocatable_double_registers() < | 867 if (RegisterConfiguration::ArchDefault()->num_double_registers() < 2) return; |
| 893 2) | 868 |
| 894 return; | 869 int rarray[] = {0}; |
| 895 if (RegisterConfiguration::ArchDefault() | |
| 896 ->num_allocatable_general_registers() < 2) | |
| 897 return; | |
| 898 int rarray[] = { | |
| 899 RegisterConfiguration::ArchDefault()->GetAllocatableDoubleCode(0)}; | |
| 900 ArgsBuffer<float64>::Sig sig(2); | 870 ArgsBuffer<float64>::Sig sig(2); |
| 901 | 871 |
| 902 Float64RegisterPairs pairs; | 872 Float64RegisterPairs pairs; |
| 903 Zone zone; | 873 Zone zone; |
| 904 while (pairs.More()) { | 874 while (pairs.More()) { |
| 905 int parray[2]; | 875 int parray[2]; |
| 906 pairs.Next(&parray[0], &parray[1], false); | 876 pairs.Next(&parray[0], &parray[1], false); |
| 907 Allocator params(nullptr, 0, parray, 2); | 877 Allocator params(nullptr, 0, parray, 2); |
| 908 Allocator rets(nullptr, 0, rarray, 1); | 878 Allocator rets(nullptr, 0, rarray, 1); |
| 909 RegisterConfig config(params, rets); | 879 RegisterConfig config(params, rets); |
| 910 | 880 |
| 911 CallDescriptor* desc = config.Create(&zone, &sig); | 881 CallDescriptor* desc = config.Create(&zone, &sig); |
| 912 RunSelect<float64, 0>(desc); | 882 RunSelect<float64, 0>(desc); |
| 913 RunSelect<float64, 1>(desc); | 883 RunSelect<float64, 1>(desc); |
| 914 } | 884 } |
| 915 } | 885 } |
| 916 | 886 |
| 917 | 887 |
| 918 TEST(Float32Select_stack_params_return_reg) { | 888 TEST(Float32Select_stack_params_return_reg) { |
| 919 if (DISABLE_NATIVE_STACK_PARAMS) return; | 889 if (DISABLE_NATIVE_STACK_PARAMS) return; |
| 920 int rarray[] = { | 890 int rarray[] = {0}; |
| 921 RegisterConfiguration::ArchDefault()->GetAllocatableDoubleCode(0)}; | |
| 922 Allocator params(nullptr, 0, nullptr, 0); | 891 Allocator params(nullptr, 0, nullptr, 0); |
| 923 Allocator rets(nullptr, 0, rarray, 1); | 892 Allocator rets(nullptr, 0, rarray, 1); |
| 924 RegisterConfig config(params, rets); | 893 RegisterConfig config(params, rets); |
| 925 | 894 |
| 926 Zone zone; | 895 Zone zone; |
| 927 for (int count = 1; count < 6; count++) { | 896 for (int count = 1; count < 6; count++) { |
| 928 ArgsBuffer<float32>::Sig sig(count); | 897 ArgsBuffer<float32>::Sig sig(count); |
| 929 CallDescriptor* desc = config.Create(&zone, &sig); | 898 CallDescriptor* desc = config.Create(&zone, &sig); |
| 930 RunSelect<float32, 0>(desc); | 899 RunSelect<float32, 0>(desc); |
| 931 RunSelect<float32, 1>(desc); | 900 RunSelect<float32, 1>(desc); |
| 932 RunSelect<float32, 2>(desc); | 901 RunSelect<float32, 2>(desc); |
| 933 RunSelect<float32, 3>(desc); | 902 RunSelect<float32, 3>(desc); |
| 934 RunSelect<float32, 4>(desc); | 903 RunSelect<float32, 4>(desc); |
| 935 RunSelect<float32, 5>(desc); | 904 RunSelect<float32, 5>(desc); |
| 936 } | 905 } |
| 937 } | 906 } |
| 938 | 907 |
| 939 | 908 |
| 940 TEST(Float64Select_stack_params_return_reg) { | 909 TEST(Float64Select_stack_params_return_reg) { |
| 941 if (DISABLE_NATIVE_STACK_PARAMS) return; | 910 if (DISABLE_NATIVE_STACK_PARAMS) return; |
| 942 int rarray[] = { | 911 int rarray[] = {0}; |
| 943 RegisterConfiguration::ArchDefault()->GetAllocatableDoubleCode(0)}; | |
| 944 Allocator params(nullptr, 0, nullptr, 0); | 912 Allocator params(nullptr, 0, nullptr, 0); |
| 945 Allocator rets(nullptr, 0, rarray, 1); | 913 Allocator rets(nullptr, 0, rarray, 1); |
| 946 RegisterConfig config(params, rets); | 914 RegisterConfig config(params, rets); |
| 947 | 915 |
| 948 Zone zone; | 916 Zone zone; |
| 949 for (int count = 1; count < 6; count++) { | 917 for (int count = 1; count < 6; count++) { |
| 950 ArgsBuffer<float64>::Sig sig(count); | 918 ArgsBuffer<float64>::Sig sig(count); |
| 951 CallDescriptor* desc = config.Create(&zone, &sig); | 919 CallDescriptor* desc = config.Create(&zone, &sig); |
| 952 RunSelect<float64, 0>(desc); | 920 RunSelect<float64, 0>(desc); |
| 953 RunSelect<float64, 1>(desc); | 921 RunSelect<float64, 1>(desc); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 987 | 955 |
| 988 Node* call = raw.CallN(desc, target, args); | 956 Node* call = raw.CallN(desc, target, args); |
| 989 raw.Return(call); | 957 raw.Return(call); |
| 990 } | 958 } |
| 991 } | 959 } |
| 992 | 960 |
| 993 | 961 |
| 994 TEST(Float64StackParamsToStackParams) { | 962 TEST(Float64StackParamsToStackParams) { |
| 995 if (DISABLE_NATIVE_STACK_PARAMS) return; | 963 if (DISABLE_NATIVE_STACK_PARAMS) return; |
| 996 | 964 |
| 997 int rarray[] = { | 965 int rarray[] = {0}; |
| 998 RegisterConfiguration::ArchDefault()->GetAllocatableDoubleCode(0)}; | |
| 999 Allocator params(nullptr, 0, nullptr, 0); | 966 Allocator params(nullptr, 0, nullptr, 0); |
| 1000 Allocator rets(nullptr, 0, rarray, 1); | 967 Allocator rets(nullptr, 0, rarray, 1); |
| 1001 | 968 |
| 1002 Zone zone; | 969 Zone zone; |
| 1003 ArgsBuffer<float64>::Sig sig(2); | 970 ArgsBuffer<float64>::Sig sig(2); |
| 1004 RegisterConfig config(params, rets); | 971 RegisterConfig config(params, rets); |
| 1005 CallDescriptor* desc = config.Create(&zone, &sig); | 972 CallDescriptor* desc = config.Create(&zone, &sig); |
| 1006 | 973 |
| 1007 Run_Computation<float64>(desc, Build_Select_With_Call<float64, 0>, | 974 Run_Computation<float64>(desc, Build_Select_With_Call<float64, 0>, |
| 1008 Compute_Select<float64, 0>, 1098); | 975 Compute_Select<float64, 0>, 1098); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1031 kMachInt32, kMachFloat64, kMachInt32, kMachFloat32}; | 998 kMachInt32, kMachFloat64, kMachInt32, kMachFloat32}; |
| 1032 #endif | 999 #endif |
| 1033 | 1000 |
| 1034 Isolate* isolate = CcTest::InitIsolateOnce(); | 1001 Isolate* isolate = CcTest::InitIsolateOnce(); |
| 1035 | 1002 |
| 1036 // Build machine signature | 1003 // Build machine signature |
| 1037 MachineType* params = &types[start]; | 1004 MachineType* params = &types[start]; |
| 1038 const int num_params = static_cast<int>(arraysize(types) - start); | 1005 const int num_params = static_cast<int>(arraysize(types) - start); |
| 1039 | 1006 |
| 1040 // Build call descriptor | 1007 // Build call descriptor |
| 1041 int parray_gp[] = { | 1008 int parray[] = {0, 1}; |
| 1042 RegisterConfiguration::ArchDefault()->GetAllocatableGeneralCode(0), | 1009 int rarray[] = {0}; |
| 1043 RegisterConfiguration::ArchDefault()->GetAllocatableGeneralCode(1)}; | 1010 Allocator palloc(parray, 2, parray, 2); |
| 1044 int rarray_gp[] = { | 1011 Allocator ralloc(rarray, 1, rarray, 1); |
| 1045 RegisterConfiguration::ArchDefault()->GetAllocatableGeneralCode(0)}; | |
| 1046 int parray_fp[] = { | |
| 1047 RegisterConfiguration::ArchDefault()->GetAllocatableDoubleCode(0), | |
| 1048 RegisterConfiguration::ArchDefault()->GetAllocatableDoubleCode(1)}; | |
| 1049 int rarray_fp[] = { | |
| 1050 RegisterConfiguration::ArchDefault()->GetAllocatableDoubleCode(0)}; | |
| 1051 Allocator palloc(parray_gp, 2, parray_fp, 2); | |
| 1052 Allocator ralloc(rarray_gp, 1, rarray_fp, 1); | |
| 1053 RegisterConfig config(palloc, ralloc); | 1012 RegisterConfig config(palloc, ralloc); |
| 1054 | 1013 |
| 1055 for (int which = 0; which < num_params; which++) { | 1014 for (int which = 0; which < num_params; which++) { |
| 1056 Zone zone; | 1015 Zone zone; |
| 1057 HandleScope scope(isolate); | 1016 HandleScope scope(isolate); |
| 1058 MachineSignature::Builder builder(&zone, 1, num_params); | 1017 MachineSignature::Builder builder(&zone, 1, num_params); |
| 1059 builder.AddReturn(params[which]); | 1018 builder.AddReturn(params[which]); |
| 1060 for (int j = 0; j < num_params; j++) builder.AddParam(params[j]); | 1019 for (int j = 0; j < num_params; j++) builder.AddParam(params[j]); |
| 1061 MachineSignature* sig = builder.Build(); | 1020 MachineSignature* sig = builder.Build(); |
| 1062 CallDescriptor* desc = config.Create(&zone, sig); | 1021 CallDescriptor* desc = config.Create(&zone, sig); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1133 } | 1092 } |
| 1134 } | 1093 } |
| 1135 } | 1094 } |
| 1136 } | 1095 } |
| 1137 | 1096 |
| 1138 | 1097 |
| 1139 TEST(MixedParams_0) { MixedParamTest(0); } | 1098 TEST(MixedParams_0) { MixedParamTest(0); } |
| 1140 TEST(MixedParams_1) { MixedParamTest(1); } | 1099 TEST(MixedParams_1) { MixedParamTest(1); } |
| 1141 TEST(MixedParams_2) { MixedParamTest(2); } | 1100 TEST(MixedParams_2) { MixedParamTest(2); } |
| 1142 TEST(MixedParams_3) { MixedParamTest(3); } | 1101 TEST(MixedParams_3) { MixedParamTest(3); } |
| OLD | NEW |