Reviewers: Toon Verwaest,
Message:
PTAL
Ben: FYI
Description:
[x86] Fix register constraints for multiply-high.
TEST=unittests
Please review this at https://codereview.chromium.org/671393002/
Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+32, -7 lines):
M src/compiler/ia32/instruction-selector-ia32.cc
M src/compiler/instruction.h
M src/compiler/x64/instruction-selector-x64.cc
M test/unittests/compiler/ia32/instruction-selector-ia32-unittest.cc
M test/unittests/compiler/instruction-selector-unittest.h
M test/unittests/compiler/instruction-selector-unittest.cc
M test/unittests/compiler/x64/instruction-selector-x64-unittest.cc
Index: src/compiler/ia32/instruction-selector-ia32.cc
diff --git a/src/compiler/ia32/instruction-selector-ia32.cc
b/src/compiler/ia32/instruction-selector-ia32.cc
index
b56230ff236ced19654e510b2f49febe9f437bd4..894794b47cf4efe5c7526ed118e561e39b1f1b9e
100644
--- a/src/compiler/ia32/instruction-selector-ia32.cc
+++ b/src/compiler/ia32/instruction-selector-ia32.cc
@@ -469,10 +469,9 @@ void InstructionSelector::VisitInt32Mul(Node* node) {
void InstructionSelector::VisitInt32MulHigh(Node* node) {
IA32OperandGenerator g(this);
InstructionOperand* temps[] = {g.TempRegister(eax)};
- size_t temp_count = arraysize(temps);
Emit(kIA32ImulHigh, g.DefineAsFixed(node, edx),
- g.UseFixed(node->InputAt(0), eax), g.UseRegister(node->InputAt(1)),
- temp_count, temps);
+ g.UseFixed(node->InputAt(0), eax),
g.UseUniqueRegister(node->InputAt(1)),
+ arraysize(temps), temps);
}
Index: src/compiler/instruction.h
diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
index
d3b8a2cab5f0c25ab1a5a2f608039cf7ba1d76ca..3a82c112e7c73542a83b384042504fc8a565ade5
100644
--- a/src/compiler/instruction.h
+++ b/src/compiler/instruction.h
@@ -257,7 +257,7 @@ class UnallocatedOperand : public InstructionOperand {
}
// [lifetime]: Only for non-FIXED_SLOT.
- bool IsUsedAtStart() {
+ bool IsUsedAtStart() const {
DCHECK(basic_policy() == EXTENDED_POLICY);
return LifetimeField::decode(value_) == USED_AT_START;
}
Index: src/compiler/x64/instruction-selector-x64.cc
diff --git a/src/compiler/x64/instruction-selector-x64.cc
b/src/compiler/x64/instruction-selector-x64.cc
index
230e000c4721bcf7f1a08ed6dc5a3b5c3f2900fc..03240c2b282a8f91e141f1b3d36547417f986059
100644
--- a/src/compiler/x64/instruction-selector-x64.cc
+++ b/src/compiler/x64/instruction-selector-x64.cc
@@ -560,10 +560,9 @@ void InstructionSelector::VisitInt64Mul(Node* node) {
void InstructionSelector::VisitInt32MulHigh(Node* node) {
X64OperandGenerator g(this);
InstructionOperand* temps[] = {g.TempRegister(rax)};
- size_t temp_count = arraysize(temps);
Emit(kX64ImulHigh32, g.DefineAsFixed(node, rdx),
- g.UseFixed(node->InputAt(0), rax), g.UseRegister(node->InputAt(1)),
- temp_count, temps);
+ g.UseFixed(node->InputAt(0), rax),
g.UseUniqueRegister(node->InputAt(1)),
+ arraysize(temps), temps);
}
Index: test/unittests/compiler/ia32/instruction-selector-ia32-unittest.cc
diff --git
a/test/unittests/compiler/ia32/instruction-selector-ia32-unittest.cc
b/test/unittests/compiler/ia32/instruction-selector-ia32-unittest.cc
index
2ce7bca708d56dc8ec4539d1c2e9d953b4efdacc..d1a17260a21e3a67e5e77fa9dd166f02622cc255
100644
--- a/test/unittests/compiler/ia32/instruction-selector-ia32-unittest.cc
+++ b/test/unittests/compiler/ia32/instruction-selector-ia32-unittest.cc
@@ -593,9 +593,12 @@ TEST_F(InstructionSelectorTest, Int32MulHigh) {
EXPECT_EQ(kIA32ImulHigh, s[0]->arch_opcode());
ASSERT_EQ(2U, s[0]->InputCount());
EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
+ EXPECT_TRUE(s.IsFixed(s[0]->InputAt(0), eax));
EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1)));
+ EXPECT_TRUE(!s.IsUsedAtStart(s[0]->InputAt(1)));
ASSERT_EQ(1U, s[0]->OutputCount());
EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
+ EXPECT_TRUE(s.IsFixed(s[0]->OutputAt(0), edx));
}
} // namespace compiler
Index: test/unittests/compiler/instruction-selector-unittest.cc
diff --git a/test/unittests/compiler/instruction-selector-unittest.cc
b/test/unittests/compiler/instruction-selector-unittest.cc
index
0b58dc09a04647041e6561f32df3eb0d65c8abb9..defc9535029698b70d1b48036bd50d385acdc917
100644
--- a/test/unittests/compiler/instruction-selector-unittest.cc
+++ b/test/unittests/compiler/instruction-selector-unittest.cc
@@ -129,6 +129,24 @@ int InstructionSelectorTest::Stream::ToVreg(const
Node* node) const {
}
+bool InstructionSelectorTest::Stream::IsFixed(const InstructionOperand*
operand,
+ Register reg) const {
+ if (!operand->IsUnallocated()) return false;
+ const UnallocatedOperand* unallocated =
UnallocatedOperand::cast(operand);
+ if (!unallocated->HasFixedRegisterPolicy()) return false;
+ const int index = Register::ToAllocationIndex(reg);
+ return unallocated->fixed_register_index() == index;
+}
+
+
+bool InstructionSelectorTest::Stream::IsUsedAtStart(
+ const InstructionOperand* operand) const {
+ if (!operand->IsUnallocated()) return false;
+ const UnallocatedOperand* unallocated =
UnallocatedOperand::cast(operand);
+ return unallocated->IsUsedAtStart();
+}
+
+
//
-----------------------------------------------------------------------------
// Return.
Index: test/unittests/compiler/instruction-selector-unittest.h
diff --git a/test/unittests/compiler/instruction-selector-unittest.h
b/test/unittests/compiler/instruction-selector-unittest.h
index
ee5f610ecd610fd8cbd8a0afe172d39a956fce46..4e498626723e104b6e5d06cd9a96835bb25138af
100644
--- a/test/unittests/compiler/instruction-selector-unittest.h
+++ b/test/unittests/compiler/instruction-selector-unittest.h
@@ -170,6 +170,9 @@ class InstructionSelectorTest : public TestWithContext,
public TestWithZone {
int ToVreg(const Node* node) const;
+ bool IsFixed(const InstructionOperand* operand, Register reg) const;
+ bool IsUsedAtStart(const InstructionOperand* operand) const;
+
FrameStateDescriptor* GetFrameStateDescriptor(int deoptimization_id) {
EXPECT_LT(deoptimization_id, GetFrameStateDescriptorCount());
return deoptimization_entries_[deoptimization_id];
Index: test/unittests/compiler/x64/instruction-selector-x64-unittest.cc
diff --git
a/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc
b/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc
index
8470818464b6e179b408c4b17a39c4f332d77051..dddb70c58d44d27adc48649b44aba21faad2c34e
100644
--- a/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc
+++ b/test/unittests/compiler/x64/instruction-selector-x64-unittest.cc
@@ -510,9 +510,12 @@ TEST_F(InstructionSelectorTest, Int32MulHigh) {
EXPECT_EQ(kX64ImulHigh32, s[0]->arch_opcode());
ASSERT_EQ(2U, s[0]->InputCount());
EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0)));
+ EXPECT_TRUE(s.IsFixed(s[0]->InputAt(0), rax));
EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1)));
+ EXPECT_TRUE(!s.IsUsedAtStart(s[0]->InputAt(1)));
ASSERT_EQ(1U, s[0]->OutputCount());
EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output()));
+ EXPECT_TRUE(s.IsFixed(s[0]->OutputAt(0), rdx));
}
} // namespace compiler
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.