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 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 namespace compiler { | 9 namespace compiler { |
10 | 10 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 } | 228 } |
229 | 229 |
230 | 230 |
231 // ARM64 FP comparison instructions. | 231 // ARM64 FP comparison instructions. |
232 const FPCmp kFPCmpInstructions[] = { | 232 const FPCmp kFPCmpInstructions[] = { |
233 {{&RawMachineAssembler::Float64Equal, "Float64Equal", kArm64Float64Cmp, | 233 {{&RawMachineAssembler::Float64Equal, "Float64Equal", kArm64Float64Cmp, |
234 kMachFloat64}, | 234 kMachFloat64}, |
235 kEqual}, | 235 kEqual}, |
236 {{&RawMachineAssembler::Float64LessThan, "Float64LessThan", | 236 {{&RawMachineAssembler::Float64LessThan, "Float64LessThan", |
237 kArm64Float64Cmp, kMachFloat64}, | 237 kArm64Float64Cmp, kMachFloat64}, |
238 kUnsignedLessThan}, | 238 kFloatLessThan}, |
239 {{&RawMachineAssembler::Float64LessThanOrEqual, "Float64LessThanOrEqual", | 239 {{&RawMachineAssembler::Float64LessThanOrEqual, "Float64LessThanOrEqual", |
240 kArm64Float64Cmp, kMachFloat64}, | 240 kArm64Float64Cmp, kMachFloat64}, |
241 kUnsignedLessThanOrEqual}}; | 241 kFloatLessThanOrEqual}, |
| 242 {{&RawMachineAssembler::Float32Equal, "Float32Equal", kArm64Float32Cmp, |
| 243 kMachFloat32}, |
| 244 kEqual}, |
| 245 {{&RawMachineAssembler::Float32LessThan, "Float32LessThan", |
| 246 kArm64Float32Cmp, kMachFloat32}, |
| 247 kFloatLessThan}, |
| 248 {{&RawMachineAssembler::Float32LessThanOrEqual, "Float32LessThanOrEqual", |
| 249 kArm64Float32Cmp, kMachFloat32}, |
| 250 kFloatLessThanOrEqual}}; |
242 | 251 |
243 | 252 |
244 struct Conversion { | 253 struct Conversion { |
245 // The machine_type field in MachInst1 represents the destination type. | 254 // The machine_type field in MachInst1 represents the destination type. |
246 MachInst1 mi; | 255 MachInst1 mi; |
247 MachineType src_machine_type; | 256 MachineType src_machine_type; |
248 }; | 257 }; |
249 | 258 |
250 | 259 |
251 std::ostream& operator<<(std::ostream& os, const Conversion& conv) { | 260 std::ostream& operator<<(std::ostream& os, const Conversion& conv) { |
(...skipping 1654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1906 EXPECT_EQ(2U, s[0]->InputCount()); | 1915 EXPECT_EQ(2U, s[0]->InputCount()); |
1907 EXPECT_EQ(1U, s[0]->OutputCount()); | 1916 EXPECT_EQ(1U, s[0]->OutputCount()); |
1908 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 1917 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
1909 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); | 1918 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); |
1910 } | 1919 } |
1911 | 1920 |
1912 | 1921 |
1913 TEST_P(InstructionSelectorFPCmpTest, WithImmediateZeroOnRight) { | 1922 TEST_P(InstructionSelectorFPCmpTest, WithImmediateZeroOnRight) { |
1914 const FPCmp cmp = GetParam(); | 1923 const FPCmp cmp = GetParam(); |
1915 StreamBuilder m(this, kMachInt32, cmp.mi.machine_type); | 1924 StreamBuilder m(this, kMachInt32, cmp.mi.machine_type); |
1916 m.Return((m.*cmp.mi.constructor)(m.Parameter(0), m.Float64Constant(0.0))); | 1925 if (cmp.mi.machine_type == kMachFloat64) { |
| 1926 m.Return((m.*cmp.mi.constructor)(m.Parameter(0), m.Float64Constant(0.0))); |
| 1927 } else { |
| 1928 m.Return((m.*cmp.mi.constructor)(m.Parameter(0), m.Float32Constant(0.0f))); |
| 1929 } |
1917 Stream s = m.Build(); | 1930 Stream s = m.Build(); |
1918 ASSERT_EQ(1U, s.size()); | 1931 ASSERT_EQ(1U, s.size()); |
1919 EXPECT_EQ(cmp.mi.arch_opcode, s[0]->arch_opcode()); | 1932 EXPECT_EQ(cmp.mi.arch_opcode, s[0]->arch_opcode()); |
1920 EXPECT_EQ(2U, s[0]->InputCount()); | 1933 EXPECT_EQ(2U, s[0]->InputCount()); |
1921 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); | 1934 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); |
1922 EXPECT_EQ(1U, s[0]->OutputCount()); | 1935 EXPECT_EQ(1U, s[0]->OutputCount()); |
1923 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 1936 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
1924 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); | 1937 EXPECT_EQ(cmp.cond, s[0]->flags_condition()); |
1925 } | 1938 } |
1926 | 1939 |
1927 | 1940 |
| 1941 TEST_P(InstructionSelectorFPCmpTest, WithImmediateZeroOnLeft) { |
| 1942 const FPCmp cmp = GetParam(); |
| 1943 StreamBuilder m(this, kMachInt32, cmp.mi.machine_type); |
| 1944 if (cmp.mi.machine_type == kMachFloat64) { |
| 1945 m.Return((m.*cmp.mi.constructor)(m.Float64Constant(0.0), m.Parameter(0))); |
| 1946 } else { |
| 1947 m.Return((m.*cmp.mi.constructor)(m.Float32Constant(0.0f), m.Parameter(0))); |
| 1948 } |
| 1949 Stream s = m.Build(); |
| 1950 ASSERT_EQ(1U, s.size()); |
| 1951 EXPECT_EQ(cmp.mi.arch_opcode, s[0]->arch_opcode()); |
| 1952 EXPECT_EQ(2U, s[0]->InputCount()); |
| 1953 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); |
| 1954 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1955 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 1956 EXPECT_EQ(CommuteFlagsCondition(cmp.cond), s[0]->flags_condition()); |
| 1957 } |
| 1958 |
| 1959 |
1928 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorFPCmpTest, | 1960 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorFPCmpTest, |
1929 ::testing::ValuesIn(kFPCmpInstructions)); | 1961 ::testing::ValuesIn(kFPCmpInstructions)); |
1930 | 1962 |
1931 | 1963 |
1932 TEST_F(InstructionSelectorTest, Float64EqualWithImmediateZeroOnLeft) { | |
1933 StreamBuilder m(this, kMachInt32, kMachFloat64); | |
1934 m.Return(m.Float64Equal(m.Float64Constant(0.0), m.Parameter(0))); | |
1935 Stream s = m.Build(); | |
1936 ASSERT_EQ(1U, s.size()); | |
1937 EXPECT_EQ(kArm64Float64Cmp, s[0]->arch_opcode()); | |
1938 EXPECT_EQ(2U, s[0]->InputCount()); | |
1939 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); | |
1940 EXPECT_EQ(1U, s[0]->OutputCount()); | |
1941 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | |
1942 EXPECT_EQ(kEqual, s[0]->flags_condition()); | |
1943 } | |
1944 | |
1945 | |
1946 // ----------------------------------------------------------------------------- | 1964 // ----------------------------------------------------------------------------- |
1947 // Conversions. | 1965 // Conversions. |
1948 | 1966 |
1949 typedef InstructionSelectorTestWithParam<Conversion> | 1967 typedef InstructionSelectorTestWithParam<Conversion> |
1950 InstructionSelectorConversionTest; | 1968 InstructionSelectorConversionTest; |
1951 | 1969 |
1952 | 1970 |
1953 TEST_P(InstructionSelectorConversionTest, Parameter) { | 1971 TEST_P(InstructionSelectorConversionTest, Parameter) { |
1954 const Conversion conv = GetParam(); | 1972 const Conversion conv = GetParam(); |
1955 StreamBuilder m(this, conv.mi.machine_type, conv.src_machine_type); | 1973 StreamBuilder m(this, conv.mi.machine_type, conv.src_machine_type); |
(...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3031 EXPECT_EQ(kArm64Float64Neg, s[0]->arch_opcode()); | 3049 EXPECT_EQ(kArm64Float64Neg, s[0]->arch_opcode()); |
3032 ASSERT_EQ(1U, s[0]->InputCount()); | 3050 ASSERT_EQ(1U, s[0]->InputCount()); |
3033 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 3051 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
3034 ASSERT_EQ(1U, s[0]->OutputCount()); | 3052 ASSERT_EQ(1U, s[0]->OutputCount()); |
3035 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 3053 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
3036 } | 3054 } |
3037 | 3055 |
3038 } // namespace compiler | 3056 } // namespace compiler |
3039 } // namespace internal | 3057 } // namespace internal |
3040 } // namespace v8 | 3058 } // namespace v8 |
OLD | NEW |