Revision: 3506 Author: [email protected] Date: Mon Dec 21 04:08:59 2009 Log: Optimize sine and cosine by checking up front if the fsin or fcos operation can throw an exception.
Review URL: http://codereview.chromium.org/504073 http://code.google.com/p/v8/source/detail?r=3506 Modified: /branches/bleeding_edge/src/ia32/codegen-ia32.cc /branches/bleeding_edge/src/ia32/codegen-ia32.h ======================================= --- /branches/bleeding_edge/src/ia32/codegen-ia32.cc Mon Dec 21 02:24:11 2009 +++ /branches/bleeding_edge/src/ia32/codegen-ia32.cc Mon Dec 21 04:08:59 2009 @@ -5390,9 +5390,17 @@ number.ToRegister(); frame_->Spill(number.reg()); FloatingPointHelper::LoadFloatOperand(masm_, number.reg()); + + // Check whether the exponent is so big that performing a sine or + // cosine operation could result in inaccurate results or an + // exception. In that case call the runtime routine. + __ and_(number.reg(), HeapNumber::kExponentMask); + __ cmp(Operand(number.reg()), Immediate(kTwoToThePowerOf63Exponent)); + call_runtime.Branch(greater_equal, not_taken); number.Unuse(); - // Perform the operation on the number. + // Perform the operation on the number. This will succeed since we + // already checked that it is in range. switch (op) { case SIN: __ fsin(); @@ -5401,14 +5409,6 @@ __ fcos(); break; } - - // Go slow case if argument to operation is out of range. - Result eax_reg = allocator_->Allocate(eax); - ASSERT(eax_reg.is_valid()); - __ fnstsw_ax(); - __ sahf(); - eax_reg.Unuse(); - call_runtime.Branch(parity_even, not_taken); // Allocate heap number for result if possible. Result scratch1 = allocator()->Allocate(); @@ -7465,9 +7465,8 @@ if (use_sse3) { CpuFeatures::Scope scope(SSE3); // Check whether the exponent is too big for a 64 bit signed integer. - const uint32_t too_big_exponent = - (HeapNumber::kExponentBias + 63) << HeapNumber::kExponentShift; - __ cmp(Operand(scratch2), Immediate(too_big_exponent)); + __ cmp(Operand(scratch2), + Immediate(CodeGenerator::kTwoToThePowerOf63Exponent)); __ j(greater_equal, conversion_failure); // Load x87 register with heap number. __ fld_d(FieldOperand(source, HeapNumber::kValueOffset)); ======================================= --- /branches/bleeding_edge/src/ia32/codegen-ia32.h Thu Dec 17 22:38:12 2009 +++ /branches/bleeding_edge/src/ia32/codegen-ia32.h Mon Dec 21 04:08:59 2009 @@ -325,6 +325,9 @@ bool in_spilled_code() const { return in_spilled_code_; } void set_in_spilled_code(bool flag) { in_spilled_code_ = flag; } + + static const uint32_t kTwoToThePowerOf63Exponent = + (HeapNumber::kExponentBias + 63) << HeapNumber::kExponentShift; private: // Construction/Destruction -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
