Index: src/x64/code-stubs-x64.cc |
diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc |
index 982639e9a56094d863d53e3bbb8d123284a05a72..2bfb0043bc50c6beaea831b862c2abff02669b18 100644 |
--- a/src/x64/code-stubs-x64.cc |
+++ b/src/x64/code-stubs-x64.cc |
@@ -1628,7 +1628,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
__ movsd(FieldOperand(rax, HeapNumber::kValueOffset), xmm1); |
__ fld_d(FieldOperand(rax, HeapNumber::kValueOffset)); |
} |
- GenerateOperation(masm); |
+ GenerateOperation(masm, type_); |
__ movq(Operand(rcx, 0), rbx); |
__ movq(Operand(rcx, 2 * kIntSize), rax); |
__ fstp_d(FieldOperand(rax, HeapNumber::kValueOffset)); |
@@ -1643,7 +1643,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
__ subq(rsp, Immediate(kDoubleSize)); |
__ movsd(Operand(rsp, 0), xmm1); |
__ fld_d(Operand(rsp, 0)); |
- GenerateOperation(masm); |
+ GenerateOperation(masm, type_); |
__ fstp_d(Operand(rsp, 0)); |
__ movsd(xmm1, Operand(rsp, 0)); |
__ addq(rsp, Immediate(kDoubleSize)); |
@@ -1695,16 +1695,17 @@ Runtime::FunctionId TranscendentalCacheStub::RuntimeFunction() { |
} |
-void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) { |
+void TranscendentalCacheStub::GenerateOperation( |
+ MacroAssembler* masm, TranscendentalCache::Type type) { |
// Registers: |
// rax: Newly allocated HeapNumber, which must be preserved. |
// rbx: Bits of input double. Must be preserved. |
// rcx: Pointer to cache entry. Must be preserved. |
// st(0): Input double |
Label done; |
- if (type_ == TranscendentalCache::SIN || |
- type_ == TranscendentalCache::COS || |
- type_ == TranscendentalCache::TAN) { |
+ if (type == TranscendentalCache::SIN || |
+ type == TranscendentalCache::COS || |
+ type == TranscendentalCache::TAN) { |
// Both fsin and fcos require arguments in the range +/-2^63 and |
// return NaN for infinities and NaN. They can share all code except |
// the actual fsin/fcos operation. |
@@ -1725,8 +1726,12 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) { |
__ j(not_equal, &non_nan_result, Label::kNear); |
// Input is +/-Infinity or NaN. Result is NaN. |
__ fstp(0); |
- __ LoadRoot(kScratchRegister, Heap::kNanValueRootIndex); |
- __ fld_d(FieldOperand(kScratchRegister, HeapNumber::kValueOffset)); |
+ // NaN is represented by 0x7ff8000000000000. |
Yang
2012/03/03 11:05:01
Loading NaN from the root list won't work if we ar
Sven Panne
2012/03/05 07:45:47
I think the cleaner and more consistent way would
|
+ __ subq(rsp, Immediate(kPointerSize)); |
+ __ movl(Operand(rsp, 4), Immediate(0x7ff80000)); |
+ __ movl(Operand(rsp, 0), Immediate(0x00000000)); |
+ __ fld_d(Operand(rsp, 0)); |
+ __ addq(rsp, Immediate(kPointerSize)); |
__ jmp(&done); |
__ bind(&non_nan_result); |
@@ -1767,7 +1772,7 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) { |
// FPU Stack: input % 2*pi |
__ movq(rax, rdi); // Restore rax, pointer to the new HeapNumber. |
__ bind(&in_range); |
- switch (type_) { |
+ switch (type) { |
case TranscendentalCache::SIN: |
__ fsin(); |
break; |
@@ -1785,7 +1790,7 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) { |
} |
__ bind(&done); |
} else { |
- ASSERT(type_ == TranscendentalCache::LOG); |
+ ASSERT(type == TranscendentalCache::LOG); |
__ fldln2(); |
__ fxch(); |
__ fyl2x(); |