| 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 f96eb274d32a80d03fef8022269cd888f8d51dcc..857bb4d5785c19953981c74dfcd09d3fd9141552 100644 | 
| --- a/src/compiler/ia32/instruction-selector-ia32.cc | 
| +++ b/src/compiler/ia32/instruction-selector-ia32.cc | 
| @@ -896,9 +896,9 @@ void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) { | 
| } | 
|  | 
|  | 
| -void InstructionSelector::EmitPrepareArguments(NodeVector* arguments, | 
| -                                               const CallDescriptor* descriptor, | 
| -                                               Node* node) { | 
| +void InstructionSelector::EmitPrepareArguments( | 
| +    ZoneVector<PushParameter>* arguments, const CallDescriptor* descriptor, | 
| +    Node* node) { | 
| IA32OperandGenerator g(this); | 
|  | 
| // Prepare for C function call. | 
| @@ -911,29 +911,34 @@ void InstructionSelector::EmitPrepareArguments(NodeVector* arguments, | 
|  | 
| // Poke any stack arguments. | 
| for (size_t n = 0; n < arguments->size(); ++n) { | 
| -      if (Node* input = (*arguments)[n]) { | 
| +      PushParameter input = (*arguments)[n]; | 
| +      if (input.node()) { | 
| int const slot = static_cast<int>(n); | 
| InstructionOperand value = g.CanBeImmediate(node) | 
| -                                       ? g.UseImmediate(input) | 
| -                                       : g.UseRegister(input); | 
| +                                       ? g.UseImmediate(input.node()) | 
| +                                       : g.UseRegister(input.node()); | 
| Emit(kIA32Poke | MiscField::encode(slot), g.NoOutput(), value); | 
| } | 
| } | 
| } else { | 
| // Push any stack arguments. | 
| -    for (Node* input : base::Reversed(*arguments)) { | 
| +    for (PushParameter input : base::Reversed(*arguments)) { | 
| // Skip any alignment holes in pushed nodes. | 
| -      if (input == nullptr) continue; | 
| -      // TODO(titzer): IA32Push cannot handle stack->stack double moves | 
| -      // because there is no way to encode fixed double slots. | 
| +      if (input.node() == nullptr) continue; | 
| InstructionOperand value = | 
| -          g.CanBeImmediate(input) | 
| -              ? g.UseImmediate(input) | 
| +          g.CanBeImmediate(input.node()) | 
| +              ? g.UseImmediate(input.node()) | 
| : IsSupported(ATOM) || | 
| -                        sequence()->IsFloat(GetVirtualRegister(input)) | 
| -                    ? g.UseRegister(input) | 
| -                    : g.Use(input); | 
| -      Emit(kIA32Push, g.NoOutput(), value); | 
| +                        sequence()->IsFloat(GetVirtualRegister(input.node())) | 
| +                    ? g.UseRegister(input.node()) | 
| +                    : g.Use(input.node()); | 
| +      if (input.type() == MachineType::Float32()) { | 
| +        Emit(kIA32PushFloat32, g.NoOutput(), value); | 
| +      } else if (input.type() == MachineType::Float64()) { | 
| +        Emit(kIA32PushFloat64, g.NoOutput(), value); | 
| +      } else { | 
| +        Emit(kIA32Push, g.NoOutput(), value); | 
| +      } | 
| } | 
| } | 
| } | 
|  |