| 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 "test/unittests/compiler/instruction-selector-unittest.h" | 5 #include "test/unittests/compiler/instruction-selector-unittest.h" |
| 6 | 6 |
| 7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 StreamBuilder m(this, kMachFloat64, kMachFloat32); | 56 StreamBuilder m(this, kMachFloat64, kMachFloat32); |
| 57 m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0))); | 57 m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0))); |
| 58 Stream s = m.Build(); | 58 Stream s = m.Build(); |
| 59 ASSERT_EQ(1U, s.size()); | 59 ASSERT_EQ(1U, s.size()); |
| 60 EXPECT_EQ(kSSECvtsd2ss, s[0]->arch_opcode()); | 60 EXPECT_EQ(kSSECvtsd2ss, s[0]->arch_opcode()); |
| 61 EXPECT_EQ(1U, s[0]->InputCount()); | 61 EXPECT_EQ(1U, s[0]->InputCount()); |
| 62 EXPECT_EQ(1U, s[0]->OutputCount()); | 62 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 63 } | 63 } |
| 64 | 64 |
| 65 | 65 |
| 66 TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithParameter) { |
| 67 StreamBuilder m(this, kMachInt32, kMachInt64); |
| 68 m.Return(m.TruncateInt64ToInt32(m.Parameter(0))); |
| 69 Stream s = m.Build(); |
| 70 ASSERT_EQ(1U, s.size()); |
| 71 EXPECT_EQ(kX64Movl, s[0]->arch_opcode()); |
| 72 } |
| 73 |
| 74 |
| 66 // ----------------------------------------------------------------------------- | 75 // ----------------------------------------------------------------------------- |
| 67 // Loads and stores | 76 // Loads and stores |
| 68 | 77 |
| 69 namespace { | 78 namespace { |
| 70 | 79 |
| 71 struct MemoryAccess { | 80 struct MemoryAccess { |
| 72 MachineType type; | 81 MachineType type; |
| 73 ArchOpcode load_opcode; | 82 ArchOpcode load_opcode; |
| 74 ArchOpcode store_opcode; | 83 ArchOpcode store_opcode; |
| 75 }; | 84 }; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 | 199 |
| 191 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, | 200 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, |
| 192 InstructionSelectorChangeUint32ToUint64Test, | 201 InstructionSelectorChangeUint32ToUint64Test, |
| 193 ::testing::ValuesIn(kWord32BinaryOperations)); | 202 ::testing::ValuesIn(kWord32BinaryOperations)); |
| 194 | 203 |
| 195 | 204 |
| 196 // ----------------------------------------------------------------------------- | 205 // ----------------------------------------------------------------------------- |
| 197 // TruncateInt64ToInt32. | 206 // TruncateInt64ToInt32. |
| 198 | 207 |
| 199 | 208 |
| 200 TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithParameter) { | 209 TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithWord64Sar) { |
| 201 StreamBuilder m(this, kMachInt32, kMachInt64); | 210 StreamBuilder m(this, kMachInt32, kMachInt64); |
| 202 m.Return(m.TruncateInt64ToInt32(m.Parameter(0))); | 211 Node* const p = m.Parameter(0); |
| 212 Node* const t = m.TruncateInt64ToInt32(m.Word64Sar(p, m.Int64Constant(32))); |
| 213 m.Return(t); |
| 203 Stream s = m.Build(); | 214 Stream s = m.Build(); |
| 204 ASSERT_EQ(0U, s.size()); | 215 ASSERT_EQ(1U, s.size()); |
| 216 EXPECT_EQ(kX64Shr, s[0]->arch_opcode()); |
| 217 ASSERT_EQ(2U, s[0]->InputCount()); |
| 218 EXPECT_EQ(s.ToVreg(p), s.ToVreg(s[0]->InputAt(0))); |
| 219 EXPECT_EQ(32, s.ToInt32(s[0]->InputAt(1))); |
| 220 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 221 EXPECT_TRUE(s.IsSameAsFirst(s[0]->OutputAt(0))); |
| 222 EXPECT_EQ(s.ToVreg(t), s.ToVreg(s[0]->OutputAt(0))); |
| 205 } | 223 } |
| 206 | 224 |
| 207 | 225 |
| 208 TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithWord64Sar) { | 226 TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithWord64Shr) { |
| 209 TRACED_FORRANGE(int32_t, k, 1, 32) { | 227 StreamBuilder m(this, kMachInt32, kMachInt64); |
| 210 StreamBuilder m(this, kMachInt32, kMachInt64); | 228 Node* const p = m.Parameter(0); |
| 211 Node* const p = m.Parameter(0); | 229 Node* const t = m.TruncateInt64ToInt32(m.Word64Shr(p, m.Int64Constant(32))); |
| 212 Node* const t = m.TruncateInt64ToInt32(m.Word64Sar(p, m.Int64Constant(k))); | 230 m.Return(t); |
| 213 m.Return(t); | 231 Stream s = m.Build(); |
| 214 Stream s = m.Build(); | 232 ASSERT_EQ(1U, s.size()); |
| 215 ASSERT_EQ(1U, s.size()); | 233 EXPECT_EQ(kX64Shr, s[0]->arch_opcode()); |
| 216 EXPECT_EQ(kX64Shr, s[0]->arch_opcode()); | 234 ASSERT_EQ(2U, s[0]->InputCount()); |
| 217 ASSERT_EQ(2U, s[0]->InputCount()); | 235 EXPECT_EQ(s.ToVreg(p), s.ToVreg(s[0]->InputAt(0))); |
| 218 EXPECT_EQ(s.ToVreg(p), s.ToVreg(s[0]->InputAt(0))); | 236 EXPECT_EQ(32, s.ToInt32(s[0]->InputAt(1))); |
| 219 EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(1))); | 237 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 220 ASSERT_EQ(1U, s[0]->OutputCount()); | 238 EXPECT_TRUE(s.IsSameAsFirst(s[0]->OutputAt(0))); |
| 221 EXPECT_TRUE(s.IsSameAsFirst(s[0]->OutputAt(0))); | 239 EXPECT_EQ(s.ToVreg(t), s.ToVreg(s[0]->OutputAt(0))); |
| 222 EXPECT_EQ(s.ToVreg(t), s.ToVreg(s[0]->OutputAt(0))); | |
| 223 } | |
| 224 } | 240 } |
| 225 | 241 |
| 226 | 242 |
| 227 TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithWord64Shl) { | |
| 228 TRACED_FORRANGE(int32_t, k, 1, 31) { | |
| 229 StreamBuilder m(this, kMachInt32, kMachInt64); | |
| 230 Node* const p = m.Parameter(0); | |
| 231 Node* const t = m.TruncateInt64ToInt32(m.Word64Shl(p, m.Int64Constant(k))); | |
| 232 m.Return(t); | |
| 233 Stream s = m.Build(); | |
| 234 ASSERT_EQ(1U, s.size()); | |
| 235 EXPECT_EQ(kX64Shl32, s[0]->arch_opcode()); | |
| 236 ASSERT_EQ(2U, s[0]->InputCount()); | |
| 237 EXPECT_EQ(s.ToVreg(p), s.ToVreg(s[0]->InputAt(0))); | |
| 238 EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(1))); | |
| 239 ASSERT_EQ(1U, s[0]->OutputCount()); | |
| 240 EXPECT_TRUE(s.IsSameAsFirst(s[0]->OutputAt(0))); | |
| 241 EXPECT_EQ(s.ToVreg(t), s.ToVreg(s[0]->OutputAt(0))); | |
| 242 } | |
| 243 } | |
| 244 | |
| 245 | |
| 246 // ----------------------------------------------------------------------------- | 243 // ----------------------------------------------------------------------------- |
| 247 // Addition. | 244 // Addition. |
| 248 | 245 |
| 249 | 246 |
| 250 TEST_F(InstructionSelectorTest, Int32AddWithInt32ParametersLea) { | 247 TEST_F(InstructionSelectorTest, Int32AddWithInt32ParametersLea) { |
| 251 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 248 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 252 Node* const p0 = m.Parameter(0); | 249 Node* const p0 = m.Parameter(0); |
| 253 Node* const p1 = m.Parameter(1); | 250 Node* const p1 = m.Parameter(1); |
| 254 Node* const a0 = m.Int32Add(p0, p1); | 251 Node* const a0 = m.Int32Add(p0, p1); |
| 255 // Additional uses of input to add chooses lea | 252 // Additional uses of input to add chooses lea |
| (...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1126 ASSERT_EQ(1U, s[0]->InputCount()); | 1123 ASSERT_EQ(1U, s[0]->InputCount()); |
| 1127 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 1124 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
| 1128 ASSERT_EQ(1U, s[0]->OutputCount()); | 1125 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 1129 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 1126 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 1130 } | 1127 } |
| 1131 } | 1128 } |
| 1132 | 1129 |
| 1133 } // namespace compiler | 1130 } // namespace compiler |
| 1134 } // namespace internal | 1131 } // namespace internal |
| 1135 } // namespace v8 | 1132 } // namespace v8 |
| OLD | NEW |