Index: test/unittests/register-configuration-unittest.cc |
diff --git a/test/unittests/register-configuration-unittest.cc b/test/unittests/register-configuration-unittest.cc |
index 31333eef29a6274ff5fb73400e3f729c69afad03..9633a808bc06693732273f438fb66ef2b4140654 100644 |
--- a/test/unittests/register-configuration-unittest.cc |
+++ b/test/unittests/register-configuration-unittest.cc |
@@ -10,6 +10,7 @@ namespace internal { |
const MachineRepresentation kFloat32 = MachineRepresentation::kFloat32; |
const MachineRepresentation kFloat64 = MachineRepresentation::kFloat64; |
+const MachineRepresentation kSimd128 = MachineRepresentation::kSimd128; |
class RegisterConfigurationUnitTest : public ::testing::Test { |
public: |
@@ -30,7 +31,7 @@ TEST_F(RegisterConfigurationUnitTest, BasicProperties) { |
RegisterConfiguration test( |
kNumGeneralRegs, kNumDoubleRegs, kNumAllocatableGeneralRegs, |
kNumAllocatableDoubleRegs, general_codes, double_codes, |
- RegisterConfiguration::OVERLAP, nullptr, nullptr, nullptr); |
+ RegisterConfiguration::OVERLAP, nullptr, nullptr, nullptr, nullptr); |
EXPECT_EQ(test.num_general_registers(), kNumGeneralRegs); |
EXPECT_EQ(test.num_double_registers(), kNumDoubleRegs); |
@@ -38,6 +39,8 @@ TEST_F(RegisterConfigurationUnitTest, BasicProperties) { |
kNumAllocatableGeneralRegs); |
EXPECT_EQ(test.num_allocatable_double_registers(), kNumAllocatableDoubleRegs); |
EXPECT_EQ(test.num_allocatable_float_registers(), kNumAllocatableDoubleRegs); |
+ EXPECT_EQ(test.num_allocatable_simd128_registers(), |
+ kNumAllocatableDoubleRegs); |
EXPECT_EQ(test.allocatable_general_codes_mask(), |
(1 << general_codes[0]) | (1 << general_codes[1])); |
@@ -45,11 +48,15 @@ TEST_F(RegisterConfigurationUnitTest, BasicProperties) { |
EXPECT_EQ(test.GetAllocatableGeneralCode(1), general_codes[1]); |
EXPECT_EQ(test.allocatable_double_codes_mask(), |
(1 << double_codes[0]) | (1 << double_codes[1])); |
+ EXPECT_EQ(test.GetAllocatableFloatCode(0), double_codes[0]); |
EXPECT_EQ(test.GetAllocatableDoubleCode(0), double_codes[0]); |
+ EXPECT_EQ(test.GetAllocatableSimd128Code(0), double_codes[0]); |
+ EXPECT_EQ(test.GetAllocatableFloatCode(1), double_codes[1]); |
EXPECT_EQ(test.GetAllocatableDoubleCode(1), double_codes[1]); |
+ EXPECT_EQ(test.GetAllocatableSimd128Code(1), double_codes[1]); |
} |
-TEST_F(RegisterConfigurationUnitTest, Aliasing) { |
+TEST_F(RegisterConfigurationUnitTest, CombineAliasing) { |
const int kNumGeneralRegs = 3; |
const int kNumDoubleRegs = 4; |
const int kNumAllocatableGeneralRegs = 2; |
@@ -60,7 +67,7 @@ TEST_F(RegisterConfigurationUnitTest, Aliasing) { |
RegisterConfiguration test( |
kNumGeneralRegs, kNumDoubleRegs, kNumAllocatableGeneralRegs, |
kNumAllocatableDoubleRegs, general_codes, double_codes, |
- RegisterConfiguration::COMBINE, nullptr, nullptr, nullptr); |
+ RegisterConfiguration::COMBINE, nullptr, nullptr, nullptr, nullptr); |
// There are 3 allocatable double regs, but only 2 can alias float regs. |
EXPECT_EQ(test.num_allocatable_float_registers(), 4); |
@@ -71,20 +78,41 @@ TEST_F(RegisterConfigurationUnitTest, Aliasing) { |
EXPECT_EQ(test.GetAllocatableFloatCode(2), double_codes[1] * 2); |
EXPECT_EQ(test.GetAllocatableFloatCode(3), double_codes[1] * 2 + 1); |
+ // There are 3 allocatable double regs, but only 2 pair to form 1 SIMD reg. |
+ EXPECT_EQ(test.num_allocatable_simd128_registers(), 1); |
+ |
+ // Test that even-odd pairs of double regs combine to form a SIMD reg. |
+ EXPECT_EQ(test.GetAllocatableSimd128Code(0), double_codes[0] / 2); |
+ |
// Registers alias themselves. |
EXPECT_TRUE(test.AreAliases(kFloat32, 0, kFloat32, 0)); |
EXPECT_TRUE(test.AreAliases(kFloat64, 0, kFloat64, 0)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 0, kSimd128, 0)); |
// Registers don't alias other registers of the same size. |
EXPECT_FALSE(test.AreAliases(kFloat32, 1, kFloat32, 0)); |
EXPECT_FALSE(test.AreAliases(kFloat64, 1, kFloat64, 0)); |
- // Float registers combine in pairs and alias double registers. |
+ EXPECT_FALSE(test.AreAliases(kSimd128, 1, kSimd128, 0)); |
+ // Float registers combine in pairs to alias a double with index / 2, and |
+ // in 4's to alias a simd128 with index / 4. |
EXPECT_TRUE(test.AreAliases(kFloat32, 0, kFloat64, 0)); |
EXPECT_TRUE(test.AreAliases(kFloat32, 1, kFloat64, 0)); |
+ EXPECT_TRUE(test.AreAliases(kFloat32, 0, kSimd128, 0)); |
+ EXPECT_TRUE(test.AreAliases(kFloat32, 1, kSimd128, 0)); |
+ EXPECT_TRUE(test.AreAliases(kFloat32, 2, kSimd128, 0)); |
+ EXPECT_TRUE(test.AreAliases(kFloat32, 3, kSimd128, 0)); |
EXPECT_TRUE(test.AreAliases(kFloat64, 0, kFloat32, 0)); |
EXPECT_TRUE(test.AreAliases(kFloat64, 0, kFloat32, 1)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 0, kFloat32, 0)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 0, kFloat32, 1)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 0, kFloat32, 2)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 0, kFloat32, 3)); |
EXPECT_FALSE(test.AreAliases(kFloat32, 0, kFloat64, 1)); |
EXPECT_FALSE(test.AreAliases(kFloat32, 1, kFloat64, 1)); |
+ EXPECT_FALSE(test.AreAliases(kFloat32, 0, kSimd128, 1)); |
+ EXPECT_FALSE(test.AreAliases(kFloat32, 1, kSimd128, 1)); |
+ EXPECT_FALSE(test.AreAliases(kFloat64, 0, kSimd128, 1)); |
+ EXPECT_FALSE(test.AreAliases(kFloat64, 1, kSimd128, 1)); |
EXPECT_TRUE(test.AreAliases(kFloat64, 0, kFloat32, 1)); |
EXPECT_TRUE(test.AreAliases(kFloat64, 1, kFloat32, 2)); |
@@ -92,6 +120,12 @@ TEST_F(RegisterConfigurationUnitTest, Aliasing) { |
EXPECT_TRUE(test.AreAliases(kFloat64, 2, kFloat32, 4)); |
EXPECT_TRUE(test.AreAliases(kFloat64, 2, kFloat32, 5)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 0, kFloat64, 1)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 1, kFloat64, 2)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 1, kFloat64, 3)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 2, kFloat64, 4)); |
+ EXPECT_TRUE(test.AreAliases(kSimd128, 2, kFloat64, 5)); |
+ |
int alias_base_index = -1; |
EXPECT_EQ(test.GetAliases(kFloat32, 0, kFloat32, &alias_base_index), 1); |
EXPECT_EQ(alias_base_index, 0); |
@@ -112,7 +146,7 @@ TEST_F(RegisterConfigurationUnitTest, Aliasing) { |
// Non-allocatable codes still alias. |
EXPECT_EQ(test.GetAliases(kFloat64, 2, kFloat32, &alias_base_index), 2); |
EXPECT_EQ(alias_base_index, 4); |
- // High numbered double registers don't alias nonexistent single registers. |
+ // High numbered double and simd regs don't alias nonexistent float registers. |
EXPECT_EQ( |
test.GetAliases(kFloat64, RegisterConfiguration::kMaxFPRegisters / 2, |
kFloat32, &alias_base_index), |