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 a5f72c70b230320108f454b9fd62fa654d51467f..45aa782a4ff77b8355c18ff426692739f44a3758 100644 |
--- a/src/compiler/ia32/instruction-selector-ia32.cc |
+++ b/src/compiler/ia32/instruction-selector-ia32.cc |
@@ -763,20 +763,27 @@ void InstructionSelector::VisitInt32PairMul(Node* node) { |
Node* projection1 = NodeProperties::FindProjection(node, 1); |
if (projection1) { |
- // InputAt(3) explicitly shares ecx with OutputRegister(1) to save one |
- // register and one mov instruction. |
- InstructionOperand inputs[] = {g.UseUnique(node->InputAt(0)), |
- g.UseUnique(node->InputAt(1)), |
- g.UseUniqueRegister(node->InputAt(2)), |
- g.UseFixed(node->InputAt(3), ecx)}; |
+ Node* lout = node; |
+ Node* hout = NodeProperties::FindProjection(node, 1); |
+ int temp1 = g.AllocateVirtualRegister(); |
+ int temp2 = g.AllocateVirtualRegister(); |
+ int temp3 = g.AllocateVirtualRegister(); |
+ int temp4 = g.AllocateVirtualRegister(); |
+ |
+ Emit(kIA32Imul, g.DefineAsFixedForVreg(temp1, ecx), |
+ g.UseFixed(node->InputAt(3), ecx), g.Use(node->InputAt(0))); |
+ Emit(kIA32Imul, g.DefineAsFixedForVreg(temp2, edx), |
+ g.UseFixed(node->InputAt(1), edx), g.Use(node->InputAt(2))); |
+ Emit(kIA32Add, g.DefineAsFixedForVreg(temp3, ecx), |
+ g.UseFixedForVreg(temp2, ecx), g.UseRegisterForVreg(temp1)); |
+ InstructionOperand outputs[] = {g.DefineAsFixed(lout, eax), |
+ g.DefineAsFixedForVreg(temp4, edx)}; |
+ InstructionOperand inputs[] = {g.UseUniqueRegister(node->InputAt(0)), |
+ g.UseUniqueRegister(node->InputAt(2))}; |
+ Emit(kIA32Umul, 2, outputs, 2, inputs); |
+ Emit(kIA32Add, g.DefineAsFixed(hout, ecx), g.UseFixedForVreg(temp3, ecx), |
+ g.UseRegisterForVreg(temp4)); |
- InstructionOperand outputs[] = { |
- g.DefineAsFixed(node, eax), |
- g.DefineAsFixed(NodeProperties::FindProjection(node, 1), ecx)}; |
- |
- InstructionOperand temps[] = {g.TempRegister(edx)}; |
- |
- Emit(kIA32MulPair, 2, outputs, 4, inputs, 1, temps); |
} else { |
// The high word of the result is not used, so we emit the standard 32 bit |
// instruction. |