Chromium Code Reviews| 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(); |