Index: src/compiler/ia32/code-generator-ia32.cc |
diff --git a/src/compiler/ia32/code-generator-ia32.cc b/src/compiler/ia32/code-generator-ia32.cc |
index 69c16a0faaf03f5a8e852223316034941caf63fb..a7e5e387e1fdf427867f380d61eba2b50c28b5f0 100644 |
--- a/src/compiler/ia32/code-generator-ia32.cc |
+++ b/src/compiler/ia32/code-generator-ia32.cc |
@@ -363,9 +363,25 @@ class OutOfLineRecordWrite final : public OutOfLineCode { |
} \ |
} while (0) |
+#define ASSEMBLE_IEEE754_BINOP(name) \ |
+ do { \ |
+ /* Pass two doubles as arguments on the stack. */ \ |
+ __ PrepareCallCFunction(4, eax); \ |
+ __ movsd(Operand(esp, 0 * kDoubleSize), i.InputDoubleRegister(0)); \ |
+ __ movsd(Operand(esp, 1 * kDoubleSize), i.InputDoubleRegister(1)); \ |
+ __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \ |
+ 4); \ |
+ /* Return value is in st(0) on ia32. */ \ |
+ /* Store it into the result register. */ \ |
+ __ sub(esp, Immediate(kDoubleSize)); \ |
+ __ fstp_d(Operand(esp, 0)); \ |
+ __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); \ |
+ __ add(esp, Immediate(kDoubleSize)); \ |
+ } while (false) |
+ |
#define ASSEMBLE_IEEE754_UNOP(name) \ |
do { \ |
- /* Pass one double as argument on the stack.*/ \ |
+ /* Pass one double as argument on the stack. */ \ |
__ PrepareCallCFunction(2, eax); \ |
__ movsd(Operand(esp, 0 * kDoubleSize), i.InputDoubleRegister(0)); \ |
__ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \ |
@@ -632,6 +648,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ lea(i.OutputRegister(), Operand(base, offset.offset())); |
break; |
} |
+ case kIeee754Float64Atan: |
+ ASSEMBLE_IEEE754_UNOP(atan); |
+ break; |
+ case kIeee754Float64Atan2: |
+ ASSEMBLE_IEEE754_BINOP(atan2); |
+ break; |
case kIeee754Float64Log: |
ASSEMBLE_IEEE754_UNOP(log); |
break; |