| 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 <list> | 5 #include <list> | 
| 6 | 6 | 
| 7 #include "src/compiler/instruction-selector-unittest.h" | 7 #include "src/compiler/instruction-selector-unittest.h" | 
| 8 | 8 | 
| 9 namespace v8 { | 9 namespace v8 { | 
| 10 namespace internal { | 10 namespace internal { | 
| (...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 848 // ----------------------------------------------------------------------------- | 848 // ----------------------------------------------------------------------------- | 
| 849 // Memory access instructions. | 849 // Memory access instructions. | 
| 850 | 850 | 
| 851 | 851 | 
| 852 namespace { | 852 namespace { | 
| 853 | 853 | 
| 854 struct MemoryAccess { | 854 struct MemoryAccess { | 
| 855   MachineType type; | 855   MachineType type; | 
| 856   ArchOpcode ldr_opcode; | 856   ArchOpcode ldr_opcode; | 
| 857   ArchOpcode str_opcode; | 857   ArchOpcode str_opcode; | 
|  | 858   const int32_t immediates[20]; | 
| 858 }; | 859 }; | 
| 859 | 860 | 
| 860 | 861 | 
| 861 std::ostream& operator<<(std::ostream& os, const MemoryAccess& memacc) { | 862 std::ostream& operator<<(std::ostream& os, const MemoryAccess& memacc) { | 
| 862   OStringStream ost; | 863   OStringStream ost; | 
| 863   ost << memacc.type; | 864   ost << memacc.type; | 
| 864   return os << ost.c_str(); | 865   return os << ost.c_str(); | 
| 865 } | 866 } | 
| 866 | 867 | 
| 867 }  // namespace | 868 }  // namespace | 
| 868 | 869 | 
| 869 | 870 | 
| 870 static const MemoryAccess kMemoryAccesses[] = { | 871 static const MemoryAccess kMemoryAccesses[] = { | 
| 871     {kMachInt8, kArm64Ldrsb, kArm64Strb}, | 872     {kMachInt8, kArm64Ldrsb, kArm64Strb, | 
| 872     {kMachUint8, kArm64Ldrb, kArm64Strb}, | 873      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 257, 258, 1000, 1001, | 
| 873     {kMachInt16, kArm64Ldrsh, kArm64Strh}, | 874       2121, 2442, 4093, 4094, 4095}}, | 
| 874     {kMachUint16, kArm64Ldrh, kArm64Strh}, | 875     {kMachUint8, kArm64Ldrb, kArm64Strb, | 
| 875     {kMachInt32, kArm64LdrW, kArm64StrW}, | 876      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 257, 258, 1000, 1001, | 
| 876     {kMachUint32, kArm64LdrW, kArm64StrW}, | 877       2121, 2442, 4093, 4094, 4095}}, | 
| 877     {kMachInt64, kArm64Ldr, kArm64Str}, | 878     {kMachInt16, kArm64Ldrsh, kArm64Strh, | 
| 878     {kMachUint64, kArm64Ldr, kArm64Str}, | 879      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 258, 260, 4096, 4098, | 
| 879     {kMachFloat32, kArm64LdrS, kArm64StrS}, | 880       4100, 4242, 6786, 8188, 8190}}, | 
| 880     {kMachFloat64, kArm64LdrD, kArm64StrD}}; | 881     {kMachUint16, kArm64Ldrh, kArm64Strh, | 
|  | 882      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 258, 260, 4096, 4098, | 
|  | 883       4100, 4242, 6786, 8188, 8190}}, | 
|  | 884     {kMachInt32, kArm64LdrW, kArm64StrW, | 
|  | 885      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 260, 4096, 4100, 8192, | 
|  | 886       8196, 3276, 3280, 16376, 16380}}, | 
|  | 887     {kMachUint32, kArm64LdrW, kArm64StrW, | 
|  | 888      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 260, 4096, 4100, 8192, | 
|  | 889       8196, 3276, 3280, 16376, 16380}}, | 
|  | 890     {kMachInt64, kArm64Ldr, kArm64Str, | 
|  | 891      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 264, 4096, 4104, 8192, | 
|  | 892       8200, 16384, 16392, 32752, 32760}}, | 
|  | 893     {kMachUint64, kArm64Ldr, kArm64Str, | 
|  | 894      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 264, 4096, 4104, 8192, | 
|  | 895       8200, 16384, 16392, 32752, 32760}}, | 
|  | 896     {kMachFloat32, kArm64LdrS, kArm64StrS, | 
|  | 897      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 260, 4096, 4100, 8192, | 
|  | 898       8196, 3276, 3280, 16376, 16380}}, | 
|  | 899     {kMachFloat64, kArm64LdrD, kArm64StrD, | 
|  | 900      {-256, -255, -3, -2, -1, 0, 1, 2, 3, 255, 256, 264, 4096, 4104, 8192, | 
|  | 901       8200, 16384, 16392, 32752, 32760}}}; | 
| 881 | 902 | 
| 882 | 903 | 
| 883 typedef InstructionSelectorTestWithParam<MemoryAccess> | 904 typedef InstructionSelectorTestWithParam<MemoryAccess> | 
| 884     InstructionSelectorMemoryAccessTest; | 905     InstructionSelectorMemoryAccessTest; | 
| 885 | 906 | 
| 886 | 907 | 
| 887 TEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) { | 908 TEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) { | 
| 888   const MemoryAccess memacc = GetParam(); | 909   const MemoryAccess memacc = GetParam(); | 
| 889   StreamBuilder m(this, memacc.type, kMachPtr, kMachInt32); | 910   StreamBuilder m(this, memacc.type, kMachPtr, kMachInt32); | 
| 890   m.Return(m.Load(memacc.type, m.Parameter(0), m.Parameter(1))); | 911   m.Return(m.Load(memacc.type, m.Parameter(0), m.Parameter(1))); | 
| 891   Stream s = m.Build(); | 912   Stream s = m.Build(); | 
| 892   ASSERT_EQ(1U, s.size()); | 913   ASSERT_EQ(1U, s.size()); | 
| 893   EXPECT_EQ(memacc.ldr_opcode, s[0]->arch_opcode()); | 914   EXPECT_EQ(memacc.ldr_opcode, s[0]->arch_opcode()); | 
| 894   EXPECT_EQ(kMode_MRR, s[0]->addressing_mode()); | 915   EXPECT_EQ(kMode_MRR, s[0]->addressing_mode()); | 
| 895   EXPECT_EQ(2U, s[0]->InputCount()); | 916   EXPECT_EQ(2U, s[0]->InputCount()); | 
| 896   EXPECT_EQ(1U, s[0]->OutputCount()); | 917   EXPECT_EQ(1U, s[0]->OutputCount()); | 
| 897 } | 918 } | 
| 898 | 919 | 
| 899 | 920 | 
|  | 921 TEST_P(InstructionSelectorMemoryAccessTest, LoadWithImmediateIndex) { | 
|  | 922   const MemoryAccess memacc = GetParam(); | 
|  | 923   TRACED_FOREACH(int32_t, index, memacc.immediates) { | 
|  | 924     StreamBuilder m(this, memacc.type, kMachPtr); | 
|  | 925     m.Return(m.Load(memacc.type, m.Parameter(0), m.Int32Constant(index))); | 
|  | 926     Stream s = m.Build(); | 
|  | 927     ASSERT_EQ(1U, s.size()); | 
|  | 928     EXPECT_EQ(memacc.ldr_opcode, s[0]->arch_opcode()); | 
|  | 929     EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); | 
|  | 930     EXPECT_EQ(2U, s[0]->InputCount()); | 
|  | 931     ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind()); | 
|  | 932     EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1))); | 
|  | 933     ASSERT_EQ(1U, s[0]->OutputCount()); | 
|  | 934   } | 
|  | 935 } | 
|  | 936 | 
|  | 937 | 
| 900 TEST_P(InstructionSelectorMemoryAccessTest, StoreWithParameters) { | 938 TEST_P(InstructionSelectorMemoryAccessTest, StoreWithParameters) { | 
| 901   const MemoryAccess memacc = GetParam(); | 939   const MemoryAccess memacc = GetParam(); | 
| 902   StreamBuilder m(this, kMachInt32, kMachPtr, kMachInt32, memacc.type); | 940   StreamBuilder m(this, kMachInt32, kMachPtr, kMachInt32, memacc.type); | 
| 903   m.Store(memacc.type, m.Parameter(0), m.Parameter(1), m.Parameter(2)); | 941   m.Store(memacc.type, m.Parameter(0), m.Parameter(1), m.Parameter(2)); | 
| 904   m.Return(m.Int32Constant(0)); | 942   m.Return(m.Int32Constant(0)); | 
| 905   Stream s = m.Build(); | 943   Stream s = m.Build(); | 
| 906   ASSERT_EQ(1U, s.size()); | 944   ASSERT_EQ(1U, s.size()); | 
| 907   EXPECT_EQ(memacc.str_opcode, s[0]->arch_opcode()); | 945   EXPECT_EQ(memacc.str_opcode, s[0]->arch_opcode()); | 
| 908   EXPECT_EQ(kMode_MRR, s[0]->addressing_mode()); | 946   EXPECT_EQ(kMode_MRR, s[0]->addressing_mode()); | 
| 909   EXPECT_EQ(3U, s[0]->InputCount()); | 947   EXPECT_EQ(3U, s[0]->InputCount()); | 
| 910   EXPECT_EQ(0U, s[0]->OutputCount()); | 948   EXPECT_EQ(0U, s[0]->OutputCount()); | 
| 911 } | 949 } | 
| 912 | 950 | 
| 913 | 951 | 
|  | 952 TEST_P(InstructionSelectorMemoryAccessTest, StoreWithImmediateIndex) { | 
|  | 953   const MemoryAccess memacc = GetParam(); | 
|  | 954   TRACED_FOREACH(int32_t, index, memacc.immediates) { | 
|  | 955     StreamBuilder m(this, kMachInt32, kMachPtr, memacc.type); | 
|  | 956     m.Store(memacc.type, m.Parameter(0), m.Int32Constant(index), | 
|  | 957             m.Parameter(1)); | 
|  | 958     m.Return(m.Int32Constant(0)); | 
|  | 959     Stream s = m.Build(); | 
|  | 960     ASSERT_EQ(1U, s.size()); | 
|  | 961     EXPECT_EQ(memacc.str_opcode, s[0]->arch_opcode()); | 
|  | 962     EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); | 
|  | 963     ASSERT_EQ(3U, s[0]->InputCount()); | 
|  | 964     ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind()); | 
|  | 965     EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1))); | 
|  | 966     EXPECT_EQ(0U, s[0]->OutputCount()); | 
|  | 967   } | 
|  | 968 } | 
|  | 969 | 
|  | 970 | 
| 914 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, | 971 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, | 
| 915                         InstructionSelectorMemoryAccessTest, | 972                         InstructionSelectorMemoryAccessTest, | 
| 916                         ::testing::ValuesIn(kMemoryAccesses)); | 973                         ::testing::ValuesIn(kMemoryAccesses)); | 
| 917 | 974 | 
| 918 }  // namespace compiler | 975 }  // namespace compiler | 
| 919 }  // namespace internal | 976 }  // namespace internal | 
| 920 }  // namespace v8 | 977 }  // namespace v8 | 
| OLD | NEW | 
|---|