| Index: src/ia32/code-stubs-ia32.cc
|
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
|
| index 048181492022a7fedbd8322363a6f47ed5038052..4633400688d3f3864d1324967522f28e8888dad1 100644
|
| --- a/src/ia32/code-stubs-ia32.cc
|
| +++ b/src/ia32/code-stubs-ia32.cc
|
| @@ -896,9 +896,6 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
|
|
| Runtime::FunctionId TranscendentalCacheStub::RuntimeFunction() {
|
| switch (type_) {
|
| - 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();
|
| @@ -913,95 +910,10 @@ void TranscendentalCacheStub::GenerateOperation(
|
| // Input value is on FP stack, and also in ebx/edx.
|
| // Input value is possibly in xmm1.
|
| // Address of result (a newly allocated HeapNumber) may be in eax.
|
| - 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.
|
| - Label in_range, done;
|
| - // If argument is outside the range -2^63..2^63, fsin/cos doesn't
|
| - // work. We must reduce it to the appropriate range.
|
| - __ mov(edi, edx);
|
| - __ and_(edi, Immediate(0x7ff00000)); // Exponent only.
|
| - int supported_exponent_limit =
|
| - (63 + HeapNumber::kExponentBias) << HeapNumber::kExponentShift;
|
| - __ cmp(edi, Immediate(supported_exponent_limit));
|
| - __ j(below, &in_range, Label::kNear);
|
| - // Check for infinity and NaN. Both return NaN for sin.
|
| - __ cmp(edi, Immediate(0x7ff00000));
|
| - Label non_nan_result;
|
| - __ j(not_equal, &non_nan_result, Label::kNear);
|
| - // Input is +/-Infinity or NaN. Result is NaN.
|
| - __ fstp(0);
|
| - // NaN is represented by 0x7ff8000000000000.
|
| - __ push(Immediate(0x7ff80000));
|
| - __ push(Immediate(0));
|
| - __ fld_d(Operand(esp, 0));
|
| - __ add(esp, Immediate(2 * kPointerSize));
|
| - __ jmp(&done, Label::kNear);
|
| -
|
| - __ bind(&non_nan_result);
|
| -
|
| - // Use fpmod to restrict argument to the range +/-2*PI.
|
| - __ mov(edi, eax); // Save eax before using fnstsw_ax.
|
| - __ fldpi();
|
| - __ fadd(0);
|
| - __ fld(1);
|
| - // FPU Stack: input, 2*pi, input.
|
| - {
|
| - Label no_exceptions;
|
| - __ fwait();
|
| - __ fnstsw_ax();
|
| - // Clear if Illegal Operand or Zero Division exceptions are set.
|
| - __ test(eax, Immediate(5));
|
| - __ j(zero, &no_exceptions, Label::kNear);
|
| - __ fnclex();
|
| - __ bind(&no_exceptions);
|
| - }
|
| -
|
| - // Compute st(0) % st(1)
|
| - {
|
| - Label partial_remainder_loop;
|
| - __ bind(&partial_remainder_loop);
|
| - __ fprem1();
|
| - __ fwait();
|
| - __ fnstsw_ax();
|
| - __ test(eax, Immediate(0x400 /* C2 */));
|
| - // If C2 is set, computation only has partial result. Loop to
|
| - // continue computation.
|
| - __ j(not_zero, &partial_remainder_loop);
|
| - }
|
| - // FPU Stack: input, 2*pi, input % 2*pi
|
| - __ fstp(2);
|
| - __ fstp(0);
|
| - __ mov(eax, edi); // Restore eax (allocated HeapNumber pointer).
|
| -
|
| - // FPU Stack: input % 2*pi
|
| - __ bind(&in_range);
|
| - switch (type) {
|
| - case TranscendentalCache::SIN:
|
| - __ fsin();
|
| - break;
|
| - case TranscendentalCache::COS:
|
| - __ fcos();
|
| - break;
|
| - case TranscendentalCache::TAN:
|
| - // FPTAN calculates tangent onto st(0) and pushes 1.0 onto the
|
| - // FP register stack.
|
| - __ fptan();
|
| - __ fstp(0); // Pop FP register stack.
|
| - break;
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| - __ bind(&done);
|
| - } else {
|
| - ASSERT(type == TranscendentalCache::LOG);
|
| - __ fldln2();
|
| - __ fxch();
|
| - __ fyl2x();
|
| - }
|
| + ASSERT(type == TranscendentalCache::LOG);
|
| + __ fldln2();
|
| + __ fxch();
|
| + __ fyl2x();
|
| }
|
|
|
|
|
|
|