Index: src/compiler/x87/code-generator-x87.cc |
diff --git a/src/compiler/x87/code-generator-x87.cc b/src/compiler/x87/code-generator-x87.cc |
index c3e999bcbffc40b1fb12c5c10f4ba20e4498e7b5..391cdcadafdbc01f5923fb84fa21fab0503a70ed 100644 |
--- a/src/compiler/x87/code-generator-x87.cc |
+++ b/src/compiler/x87/code-generator-x87.cc |
@@ -1104,7 +1104,29 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { |
break; |
} |
case kX87Push: |
- if (HasImmediateInput(instr, 0)) { |
+ if (instr->InputAt(0)->IsDoubleRegister()) { |
+ auto allocated = AllocatedOperand::cast(*instr->InputAt(0)); |
+ if (allocated.machine_type() == kRepFloat32) { |
+ __ sub(esp, Immediate(kDoubleSize)); |
+ __ fst_s(Operand(esp, 0)); |
+ } else { |
+ DCHECK(allocated.machine_type() == kRepFloat64); |
+ __ sub(esp, Immediate(kDoubleSize)); |
+ __ fst_d(Operand(esp, 0)); |
+ } |
+ } else if (instr->InputAt(0)->IsDoubleStackSlot()) { |
+ auto allocated = AllocatedOperand::cast(*instr->InputAt(0)); |
+ if (allocated.machine_type() == kRepFloat32) { |
+ __ sub(esp, Immediate(kDoubleSize)); |
+ __ fld_s(i.InputOperand(0)); |
+ __ fstp_s(MemOperand(esp, 0)); |
+ } else { |
+ DCHECK(allocated.machine_type() == kRepFloat64); |
+ __ sub(esp, Immediate(kDoubleSize)); |
+ __ fld_d(i.InputOperand(0)); |
+ __ fstp_d(MemOperand(esp, 0)); |
+ } |
+ } else if (HasImmediateInput(instr, 0)) { |
__ push(i.InputImmediate(0)); |
} else { |
__ push(i.InputOperand(0)); |