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 693ff0728d184c970a33ad8317a6fa0626e68607..51a7b2c049e2363f37bfa2ddec98265052f16a01 100644 |
| --- a/src/x64/code-stubs-x64.cc |
| +++ b/src/x64/code-stubs-x64.cc |
| @@ -1607,6 +1607,8 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
| __ cmpq(rbx, Operand(rcx, 0)); |
| __ j(not_equal, &cache_miss, Label::kNear); |
| // Cache hit! |
| + Counters* counters = masm->isolate()->counters(); |
| + __ IncrementCounter(counters->transcendental_cache_hit(), 1); |
| __ movq(rax, Operand(rcx, 2 * kIntSize)); |
| if (tagged) { |
| __ fstp(0); // Clear FPU stack. |
| @@ -1617,6 +1619,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
| } |
| __ bind(&cache_miss); |
| + __ IncrementCounter(counters->transcendental_cache_miss(), 1); |
| // Update cache with new value. |
| if (tagged) { |
| __ AllocateHeapNumber(rax, rdi, &runtime_call_clear_stack); |
| @@ -1683,6 +1686,7 @@ Runtime::FunctionId TranscendentalCacheStub::RuntimeFunction() { |
| // Add more cases when necessary. |
| case TranscendentalCache::SIN: return Runtime::kMath_sin; |
| case TranscendentalCache::COS: return Runtime::kMath_cos; |
| + case TranscendentalCache::TAN: return Runtime::kMath_tan; |
| case TranscendentalCache::LOG: return Runtime::kMath_log; |
| default: |
| UNIMPLEMENTED(); |
| @@ -1698,7 +1702,9 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) { |
| // rcx: Pointer to cache entry. Must be preserved. |
| // st(0): Input double |
| Label done; |
| - if (type_ == TranscendentalCache::SIN || type_ == TranscendentalCache::COS) { |
| + 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. |
| @@ -1768,6 +1774,12 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) { |
| case TranscendentalCache::COS: |
| __ fcos(); |
| break; |
| + case TranscendentalCache::TAN: |
| + // FPTAN computes tangent onto st(0) and pushes 1.0 onto the FP stack. |
| + __ fptan(); |
| + __ ffree(); |
| + __ fincstp(); |
|
Lasse Reichstein
2011/11/25 12:46:56
If you just want to drop the top element of the fp
|
| + break; |
| default: |
| UNREACHABLE(); |
| } |