diff options
Diffstat (limited to 'deps/v8/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc')
-rw-r--r-- | deps/v8/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc | 187 |
1 files changed, 127 insertions, 60 deletions
diff --git a/deps/v8/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc b/deps/v8/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc index 9ef0fa58ca..e524764f82 100644 --- a/deps/v8/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc +++ b/deps/v8/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc @@ -63,15 +63,6 @@ TEST_F(InstructionSelectorTest, TruncateFloat64ToFloat32WithParameter) { } -TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithParameter) { - StreamBuilder m(this, kMachInt32, kMachInt64); - m.Return(m.TruncateInt64ToInt32(m.Parameter(0))); - Stream s = m.Build(); - ASSERT_EQ(1U, s.size()); - EXPECT_EQ(kX64Movl, s[0]->arch_opcode()); -} - - // ----------------------------------------------------------------------------- // Loads and stores @@ -206,37 +197,49 @@ INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, // TruncateInt64ToInt32. -TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithWord64Sar) { +TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithParameter) { StreamBuilder m(this, kMachInt32, kMachInt64); - Node* const p = m.Parameter(0); - Node* const t = m.TruncateInt64ToInt32(m.Word64Sar(p, m.Int64Constant(32))); - m.Return(t); + m.Return(m.TruncateInt64ToInt32(m.Parameter(0))); Stream s = m.Build(); - ASSERT_EQ(1U, s.size()); - EXPECT_EQ(kX64Shr, s[0]->arch_opcode()); - ASSERT_EQ(2U, s[0]->InputCount()); - EXPECT_EQ(s.ToVreg(p), s.ToVreg(s[0]->InputAt(0))); - EXPECT_EQ(32, s.ToInt32(s[0]->InputAt(1))); - ASSERT_EQ(1U, s[0]->OutputCount()); - EXPECT_TRUE(s.IsSameAsFirst(s[0]->OutputAt(0))); - EXPECT_EQ(s.ToVreg(t), s.ToVreg(s[0]->OutputAt(0))); + ASSERT_EQ(0U, s.size()); } -TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithWord64Shr) { - StreamBuilder m(this, kMachInt32, kMachInt64); - Node* const p = m.Parameter(0); - Node* const t = m.TruncateInt64ToInt32(m.Word64Shr(p, m.Int64Constant(32))); - m.Return(t); - Stream s = m.Build(); - ASSERT_EQ(1U, s.size()); - EXPECT_EQ(kX64Shr, s[0]->arch_opcode()); - ASSERT_EQ(2U, s[0]->InputCount()); - EXPECT_EQ(s.ToVreg(p), s.ToVreg(s[0]->InputAt(0))); - EXPECT_EQ(32, s.ToInt32(s[0]->InputAt(1))); - ASSERT_EQ(1U, s[0]->OutputCount()); - EXPECT_TRUE(s.IsSameAsFirst(s[0]->OutputAt(0))); - EXPECT_EQ(s.ToVreg(t), s.ToVreg(s[0]->OutputAt(0))); +TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithWord64Sar) { + TRACED_FORRANGE(int32_t, k, 1, 32) { + StreamBuilder m(this, kMachInt32, kMachInt64); + Node* const p = m.Parameter(0); + Node* const t = m.TruncateInt64ToInt32(m.Word64Sar(p, m.Int64Constant(k))); + m.Return(t); + Stream s = m.Build(); + ASSERT_EQ(1U, s.size()); + EXPECT_EQ(kX64Shr, s[0]->arch_opcode()); + ASSERT_EQ(2U, s[0]->InputCount()); + EXPECT_EQ(s.ToVreg(p), s.ToVreg(s[0]->InputAt(0))); + EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(1))); + ASSERT_EQ(1U, s[0]->OutputCount()); + EXPECT_TRUE(s.IsSameAsFirst(s[0]->OutputAt(0))); + EXPECT_EQ(s.ToVreg(t), s.ToVreg(s[0]->OutputAt(0))); + } +} + + +TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithWord64Shl) { + TRACED_FORRANGE(int32_t, k, 1, 31) { + StreamBuilder m(this, kMachInt32, kMachInt64); + Node* const p = m.Parameter(0); + Node* const t = m.TruncateInt64ToInt32(m.Word64Shl(p, m.Int64Constant(k))); + m.Return(t); + Stream s = m.Build(); + ASSERT_EQ(1U, s.size()); + EXPECT_EQ(kX64Shl32, s[0]->arch_opcode()); + ASSERT_EQ(2U, s[0]->InputCount()); + EXPECT_EQ(s.ToVreg(p), s.ToVreg(s[0]->InputAt(0))); + EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(1))); + ASSERT_EQ(1U, s[0]->OutputCount()); + EXPECT_TRUE(s.IsSameAsFirst(s[0]->OutputAt(0))); + EXPECT_EQ(s.ToVreg(t), s.ToVreg(s[0]->OutputAt(0))); + } } @@ -991,7 +994,43 @@ TEST_F(InstructionSelectorTest, Int32Shl4BecomesLea) { // ----------------------------------------------------------------------------- -// Word64Shl. +// Floating point operations. + + +TEST_F(InstructionSelectorTest, Float64BinopArithmetic) { + { + StreamBuilder m(this, kMachFloat64, kMachFloat64, kMachFloat64); + Node* add = m.Float64Add(m.Parameter(0), m.Parameter(1)); + Node* mul = m.Float64Mul(add, m.Parameter(1)); + Node* sub = m.Float64Sub(mul, add); + Node* ret = m.Float64Div(mul, sub); + m.Return(ret); + Stream s = m.Build(AVX); + ASSERT_EQ(4U, s.size()); + EXPECT_EQ(kAVXFloat64Add, s[0]->arch_opcode()); + EXPECT_EQ(kAVXFloat64Mul, s[1]->arch_opcode()); + EXPECT_EQ(kAVXFloat64Sub, s[2]->arch_opcode()); + EXPECT_EQ(kAVXFloat64Div, s[3]->arch_opcode()); + } + { + StreamBuilder m(this, kMachFloat64, kMachFloat64, kMachFloat64); + Node* add = m.Float64Add(m.Parameter(0), m.Parameter(1)); + Node* mul = m.Float64Mul(add, m.Parameter(1)); + Node* sub = m.Float64Sub(mul, add); + Node* ret = m.Float64Div(mul, sub); + m.Return(ret); + Stream s = m.Build(); + ASSERT_EQ(4U, s.size()); + EXPECT_EQ(kSSEFloat64Add, s[0]->arch_opcode()); + EXPECT_EQ(kSSEFloat64Mul, s[1]->arch_opcode()); + EXPECT_EQ(kSSEFloat64Sub, s[2]->arch_opcode()); + EXPECT_EQ(kSSEFloat64Div, s[3]->arch_opcode()); + } +} + + +// ----------------------------------------------------------------------------- +// Miscellaneous. TEST_F(InstructionSelectorTest, Word64ShlWithChangeInt32ToInt64) { @@ -1032,34 +1071,62 @@ TEST_F(InstructionSelectorTest, Word64ShlWithChangeUint32ToUint64) { } -TEST_F(InstructionSelectorTest, Float64BinopArithmetic) { +TEST_F(InstructionSelectorTest, Word32AndWith0xff) { { - StreamBuilder m(this, kMachFloat64, kMachFloat64, kMachFloat64); - Node* add = m.Float64Add(m.Parameter(0), m.Parameter(1)); - Node* mul = m.Float64Mul(add, m.Parameter(1)); - Node* sub = m.Float64Sub(mul, add); - Node* ret = m.Float64Div(mul, sub); - m.Return(ret); - Stream s = m.Build(AVX); - ASSERT_EQ(4U, s.size()); - EXPECT_EQ(kAVXFloat64Add, s[0]->arch_opcode()); - EXPECT_EQ(kAVXFloat64Mul, s[1]->arch_opcode()); - EXPECT_EQ(kAVXFloat64Sub, s[2]->arch_opcode()); - EXPECT_EQ(kAVXFloat64Div, s[3]->arch_opcode()); + StreamBuilder m(this, kMachInt32, kMachInt32); + Node* const p0 = m.Parameter(0); + Node* const n = m.Word32And(p0, m.Int32Constant(0xff)); + m.Return(n); + Stream s = m.Build(); + ASSERT_EQ(1U, s.size()); + EXPECT_EQ(kX64Movzxbl, s[0]->arch_opcode()); + ASSERT_EQ(1U, s[0]->InputCount()); + EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); + ASSERT_EQ(1U, s[0]->OutputCount()); + EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); } { - StreamBuilder m(this, kMachFloat64, kMachFloat64, kMachFloat64); - Node* add = m.Float64Add(m.Parameter(0), m.Parameter(1)); - Node* mul = m.Float64Mul(add, m.Parameter(1)); - Node* sub = m.Float64Sub(mul, add); - Node* ret = m.Float64Div(mul, sub); - m.Return(ret); + StreamBuilder m(this, kMachInt32, kMachInt32); + Node* const p0 = m.Parameter(0); + Node* const n = m.Word32And(m.Int32Constant(0xff), p0); + m.Return(n); Stream s = m.Build(); - ASSERT_EQ(4U, s.size()); - EXPECT_EQ(kSSEFloat64Add, s[0]->arch_opcode()); - EXPECT_EQ(kSSEFloat64Mul, s[1]->arch_opcode()); - EXPECT_EQ(kSSEFloat64Sub, s[2]->arch_opcode()); - EXPECT_EQ(kSSEFloat64Div, s[3]->arch_opcode()); + ASSERT_EQ(1U, s.size()); + EXPECT_EQ(kX64Movzxbl, s[0]->arch_opcode()); + ASSERT_EQ(1U, s[0]->InputCount()); + EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); + ASSERT_EQ(1U, s[0]->OutputCount()); + EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); + } +} + + +TEST_F(InstructionSelectorTest, Word32AndWith0xffff) { + { + StreamBuilder m(this, kMachInt32, kMachInt32); + Node* const p0 = m.Parameter(0); + Node* const n = m.Word32And(p0, m.Int32Constant(0xffff)); + m.Return(n); + Stream s = m.Build(); + ASSERT_EQ(1U, s.size()); + EXPECT_EQ(kX64Movzxwl, s[0]->arch_opcode()); + ASSERT_EQ(1U, s[0]->InputCount()); + EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); + ASSERT_EQ(1U, s[0]->OutputCount()); + EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); + } + { + StreamBuilder m(this, kMachInt32, kMachInt32); + Node* const p0 = m.Parameter(0); + Node* const n = m.Word32And(m.Int32Constant(0xffff), p0); + m.Return(n); + Stream s = m.Build(); + ASSERT_EQ(1U, s.size()); + EXPECT_EQ(kX64Movzxwl, s[0]->arch_opcode()); + ASSERT_EQ(1U, s[0]->InputCount()); + EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); + ASSERT_EQ(1U, s[0]->OutputCount()); + EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); } } |