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

Reply via email to