Revision: 22921
Author:   [email protected]
Date:     Wed Aug  6 11:04:47 2014 UTC
Log:      Revert "Implement trigonometric functions using a fdlibm port."

This reverts r22918 and r22920.

[email protected]

Review URL: https://codereview.chromium.org/448633002
http://code.google.com/p/v8/source/detail?r=22921

Added:
 /branches/bleeding_edge/src/trig-table.h
 /branches/bleeding_edge/tools/generate-trig-table.py
Deleted:
 /branches/bleeding_edge/test/mjsunit/runtime-gen/rempio2.js
 /branches/bleeding_edge/third_party
Modified:
 /branches/bleeding_edge/.gitignore
 /branches/bleeding_edge/BUILD.gn
 /branches/bleeding_edge/DEPS
 /branches/bleeding_edge/src/bootstrapper.cc
 /branches/bleeding_edge/src/math.js
 /branches/bleeding_edge/src/runtime.cc
 /branches/bleeding_edge/src/runtime.h
 /branches/bleeding_edge/test/mjsunit/debug-script.js
 /branches/bleeding_edge/test/mjsunit/mirror-script.js
 /branches/bleeding_edge/test/mjsunit/sin-cos.js
 /branches/bleeding_edge/test/test262/test262.status
 /branches/bleeding_edge/tools/generate-runtime-tests.py
 /branches/bleeding_edge/tools/gyp/v8.gyp
 /branches/bleeding_edge/tools/js2c.py

=======================================
--- /dev/null
+++ /branches/bleeding_edge/src/trig-table.h    Wed Aug  6 11:04:47 2014 UTC
@@ -0,0 +1,38 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_TRIG_TABLE_H_
+#define V8_TRIG_TABLE_H_
+
+
+namespace v8 {
+namespace internal {
+
+class TrigonometricLookupTable : public AllStatic {
+ public:
+ // Casting away const-ness to use as argument for typed array constructor.
+  static void* sin_table() {
+    return const_cast<double*>(&kSinTable[0]);
+  }
+
+  static void* cos_x_interval_table() {
+    return const_cast<double*>(&kCosXIntervalTable[0]);
+  }
+
+  static double samples_over_pi_half() { return kSamplesOverPiHalf; }
+  static int samples() { return kSamples; }
+  static int table_num_bytes() { return kTableSize * sizeof(*kSinTable); }
+  static int table_size() { return kTableSize; }
+
+ private:
+  static const double kSinTable[];
+  static const double kCosXIntervalTable[];
+  static const int kSamples;
+  static const int kTableSize;
+  static const double kSamplesOverPiHalf;
+};
+
+} }  // namespace v8::internal
+
+#endif  // V8_TRIG_TABLE_H_
=======================================
--- /dev/null
+++ /branches/bleeding_edge/tools/generate-trig-table.py Wed Aug 6 11:04:47 2014 UTC
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+#
+# Copyright 2013 the V8 project authors. All rights reserved.
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.
+#     * Neither the name of Google Inc. nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# This is a utility for populating the lookup table for the
+# approximation of trigonometric functions.
+
+import sys, math
+
+SAMPLES = 1800
+
+TEMPLATE = """\
+// Copyright 2013 Google Inc. All Rights Reserved.
+
+// This file was generated from a python script.
+
+#include "src/v8.h"
+#include "src/trig-table.h"
+
+namespace v8 {
+namespace internal {
+
+  const double TrigonometricLookupTable::kSinTable[] =
+      { %(sine_table)s };
+  const double TrigonometricLookupTable::kCosXIntervalTable[] =
+      { %(cosine_table)s };
+  const int TrigonometricLookupTable::kSamples = %(samples)i;
+  const int TrigonometricLookupTable::kTableSize = %(table_size)i;
+  const double TrigonometricLookupTable::kSamplesOverPiHalf =
+      %(samples_over_pi_half)s;
+
+} }  // v8::internal
+"""
+
+def main():
+  pi_half = math.pi / 2
+  interval = pi_half / SAMPLES
+  sin = []
+  cos_times_interval = []
+  table_size = SAMPLES + 2
+
+  for i in range(0, table_size):
+    sample = i * interval
+    sin.append(repr(math.sin(sample)))
+    cos_times_interval.append(repr(math.cos(sample) * interval))
+
+  output_file = sys.argv[1]
+  output = open(str(output_file), "w")
+  output.write(TEMPLATE % {
+    'sine_table': ','.join(sin),
+    'cosine_table': ','.join(cos_times_interval),
+    'samples': SAMPLES,
+    'table_size': table_size,
+    'samples_over_pi_half': repr(SAMPLES / pi_half)
+  })
+
+if __name__ == "__main__":
+  main()
=======================================
--- /branches/bleeding_edge/test/mjsunit/runtime-gen/rempio2.js Wed Aug 6 10:33:17 2014 UTC
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2014 the V8 project authors. All rights reserved.
-// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
-// Flags: --allow-natives-syntax --harmony
-var _x = 1.5;
-%RemPiO2(_x);
=======================================
--- /branches/bleeding_edge/.gitignore  Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/.gitignore  Wed Aug  6 11:04:47 2014 UTC
@@ -63,7 +63,7 @@
 /test/test262/tc39-test262-*
 /testing/gmock
 /testing/gtest
-/third_party/icu
+/third_party
 /tools/jsfunfuzz
 /tools/jsfunfuzz.zip
 /tools/oom_dump/oom_dump
=======================================
--- /branches/bleeding_edge/BUILD.gn    Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/BUILD.gn    Wed Aug  6 11:04:47 2014 UTC
@@ -194,7 +194,6 @@
     "src/string.js",
     "src/symbol.js",
     "src/uri.js",
-    "third_party/fdlibm/fdlibm.js",
     "src/math.js",
     "src/messages.js",
     "src/apinatives.js",
@@ -866,8 +865,6 @@
     "src/zone-inl.h",
     "src/zone.cc",
     "src/zone.h",
-    "third_party/fdlibm/fdlibm.cc',
-    "third_party/fdlibm/fdlibm.h',
   ]

   if (v8_target_arch == "x86") {
=======================================
--- /branches/bleeding_edge/DEPS        Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/DEPS        Wed Aug  6 11:04:47 2014 UTC
@@ -41,7 +41,6 @@
   # Everybody can use some things.
   "+include",
   "+unicode",
-  "+third_party/fdlibm",
 ]

 # checkdeps.py shouldn't check for includes in these directories:
=======================================
--- /branches/bleeding_edge/src/bootstrapper.cc Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/src/bootstrapper.cc Wed Aug  6 11:04:47 2014 UTC
@@ -14,7 +14,7 @@
 #include "src/isolate-inl.h"
 #include "src/natives.h"
 #include "src/snapshot.h"
-#include "third_party/fdlibm/fdlibm.h"
+#include "src/trig-table.h"

 namespace v8 {
 namespace internal {
@@ -121,7 +121,7 @@
 void Bootstrapper::TearDown() {
   if (delete_these_non_arrays_on_tear_down_ != NULL) {
     int len = delete_these_non_arrays_on_tear_down_->length();
- DCHECK(len < 25); // Don't use this mechanism for unbounded allocations. + DCHECK(len < 24); // Don't use this mechanism for unbounded allocations.
     for (int i = 0; i < len; i++) {
       delete delete_these_non_arrays_on_tear_down_->at(i);
       delete_these_non_arrays_on_tear_down_->at(i) = NULL;
@@ -2651,19 +2651,43 @@
                                   NONE).Assert();

     // Initialize trigonometric lookup tables and constants.
- const int constants_size = ARRAY_SIZE(TrigonometricConstants::constants);
-    const int table_num_bytes = constants_size * kDoubleSize;
-    v8::Local<v8::ArrayBuffer> trig_buffer = v8::ArrayBuffer::New(
+ const int table_num_bytes = TrigonometricLookupTable::table_num_bytes();
+    v8::Local<v8::ArrayBuffer> sin_buffer = v8::ArrayBuffer::New(
+        reinterpret_cast<v8::Isolate*>(isolate),
+        TrigonometricLookupTable::sin_table(), table_num_bytes);
+    v8::Local<v8::ArrayBuffer> cos_buffer = v8::ArrayBuffer::New(
         reinterpret_cast<v8::Isolate*>(isolate),
-        const_cast<double*>(TrigonometricConstants::constants),
-        table_num_bytes);
-    v8::Local<v8::Float64Array> trig_table =
-        v8::Float64Array::New(trig_buffer, 0, constants_size);
+        TrigonometricLookupTable::cos_x_interval_table(), table_num_bytes);
+    v8::Local<v8::Float64Array> sin_table = v8::Float64Array::New(
+        sin_buffer, 0, TrigonometricLookupTable::table_size());
+    v8::Local<v8::Float64Array> cos_table = v8::Float64Array::New(
+        cos_buffer, 0, TrigonometricLookupTable::table_size());

+    Runtime::DefineObjectProperty(builtins,
+                                  factory()->InternalizeOneByteString(
+                                      STATIC_ASCII_VECTOR("kSinTable")),
+                                  Utils::OpenHandle(*sin_table),
+                                  NONE).Assert();
     Runtime::DefineObjectProperty(
         builtins,
-        factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("kTrig")),
-        Utils::OpenHandle(*trig_table), NONE).Assert();
+        factory()->InternalizeOneByteString(
+            STATIC_ASCII_VECTOR("kCosXIntervalTable")),
+        Utils::OpenHandle(*cos_table),
+        NONE).Assert();
+    Runtime::DefineObjectProperty(
+        builtins,
+        factory()->InternalizeOneByteString(
+            STATIC_ASCII_VECTOR("kSamples")),
+        factory()->NewHeapNumber(
+            TrigonometricLookupTable::samples()),
+        NONE).Assert();
+    Runtime::DefineObjectProperty(
+        builtins,
+        factory()->InternalizeOneByteString(
+            STATIC_ASCII_VECTOR("kIndexConvert")),
+        factory()->NewHeapNumber(
+            TrigonometricLookupTable::samples_over_pi_half()),
+        NONE).Assert();
   }

   result_ = native_context();
=======================================
--- /branches/bleeding_edge/src/math.js Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/src/math.js Wed Aug  6 11:04:47 2014 UTC
@@ -55,6 +55,12 @@
 function MathCeil(x) {
   return -MathFloor(-x);
 }
+
+// ECMA 262 - 15.8.2.7
+function MathCos(x) {
+  x = MathAbs(x);  // Convert to number and get rid of -0.
+  return TrigonometricInterpolation(x, 1);
+}

 // ECMA 262 - 15.8.2.8
 function MathExp(x) {
@@ -157,16 +163,97 @@
 function MathRound(x) {
   return %RoundNumber(TO_NUMBER_INLINE(x));
 }
+
+// ECMA 262 - 15.8.2.16
+function MathSin(x) {
+  x = x * 1;  // Convert to number and deal with -0.
+  if (%_IsMinusZero(x)) return x;
+  return TrigonometricInterpolation(x, 0);
+}

 // ECMA 262 - 15.8.2.17
 function MathSqrt(x) {
   return %_MathSqrtRT(TO_NUMBER_INLINE(x));
 }
+
+// ECMA 262 - 15.8.2.18
+function MathTan(x) {
+  return MathSin(x) / MathCos(x);
+}

 // Non-standard extension.
 function MathImul(x, y) {
   return %NumberImul(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y));
 }
+
+
+var kInversePiHalf      = 0.636619772367581343;      // 2 / pi
+var kInversePiHalfS26   = 9.48637384723993156e-9;    // 2 / pi / (2^26)
+var kS26                = 1 << 26;
+var kTwoStepThreshold   = 1 << 27;
+// pi / 2 rounded up
+var kPiHalf             = 1.570796326794896780;      // 0x192d4454fb21f93f
+// We use two parts for pi/2 to emulate a higher precision.
+// pi_half_1 only has 26 significant bits for mantissa.
+// Note that pi_half > pi_half_1 + pi_half_2
+var kPiHalf1            = 1.570796325802803040;      // 0x00000054fb21f93f
+var kPiHalf2            = 9.920935796805404252e-10;  // 0x3326a611460b113e
+
+var kSamples;            // Initialized to a number during genesis.
+var kIndexConvert; // Initialized to kSamples / (pi/2) during genesis.
+var kSinTable;           // Initialized to a Float64Array during genesis.
+var kCosXIntervalTable;  // Initialized to a Float64Array during genesis.
+
+// This implements sine using the following algorithm.
+// 1) Multiplication takes care of to-number conversion.
+// 2) Reduce x to the first quadrant [0, pi/2].
+//    Conveniently enough, in case of +/-Infinity, we get NaN.
+//    Note that we try to use only 26 instead of 52 significant bits for
+//    mantissa to avoid rounding errors when multiplying.  For very large
+//    input we therefore have additional steps.
+// 3) Replace x by (pi/2-x) if x was in the 2nd or 4th quadrant.
+// 4) Do a table lookup for the closest samples to the left and right of x.
+// 5) Find the derivatives at those sampling points by table lookup:
+//    dsin(x)/dx = cos(x) = sin(pi/2-x) for x in [0, pi/2].
+// 6) Use cubic spline interpolation to approximate sin(x).
+// 7) Negate the result if x was in the 3rd or 4th quadrant.
+// 8) Get rid of -0 by adding 0.
+function TrigonometricInterpolation(x, phase) {
+  if (x < 0 || x > kPiHalf) {
+    var multiple;
+    while (x < -kTwoStepThreshold || x > kTwoStepThreshold) {
+      // Let's assume this loop does not terminate.
+      // All numbers x in each loop forms a set S.
+      // (1) abs(x) > 2^27 for all x in S.
+      // (2) abs(multiple) != 0 since (2^27 * inverse_pi_half_s26) > 1
+ // (3) multiple is rounded down in 2^26 steps, so the rounding error is
+      //     at most max(ulp, 2^26).
+      // (4) so for x > 2^27, we subtract at most (1+pi/4)x and at least
+      //     (1-pi/4)x
+      // (5) The subtraction results in x' so that abs(x') <= abs(x)*pi/4.
+      //     Note that this difference cannot be simply rounded off.
+      // Set S cannot exist since (5) violates (1).  Loop must terminate.
+      multiple = MathFloor(x * kInversePiHalfS26) * kS26;
+      x = x - multiple * kPiHalf1 - multiple * kPiHalf2;
+    }
+    multiple = MathFloor(x * kInversePiHalf);
+    x = x - multiple * kPiHalf1 - multiple * kPiHalf2;
+    phase += multiple;
+  }
+  var double_index = x * kIndexConvert;
+  if (phase & 1) double_index = kSamples - double_index;
+  var index = double_index | 0;
+  var t1 = double_index - index;
+  var t2 = 1 - t1;
+  var y1 = kSinTable[index];
+  var y2 = kSinTable[index + 1];
+  var dy = y2 - y1;
+  return (t2 * y1 + t1 * y2 +
+              t1 * t2 * ((kCosXIntervalTable[index] - dy) * t2 +
+                         (dy - kCosXIntervalTable[index + 1]) * t1))
+         * (1 - (phase & 2)) + 0;
+}
+

 // ES6 draft 09-27-13, section 20.2.2.28.
 function MathSign(x) {
@@ -176,6 +263,7 @@
   if (x === 0) return x;
   return NAN;
 }
+

 // ES6 draft 09-27-13, section 20.2.2.34.
 function MathTrunc(x) {
@@ -185,6 +273,7 @@
   if (x === 0) return x;
   return NAN;
 }
+

 // ES6 draft 09-27-13, section 20.2.2.30.
 function MathSinh(x) {
@@ -193,6 +282,7 @@
   if (x === 0 || !NUMBER_IS_FINITE(x)) return x;
   return (MathExp(x) - MathExp(-x)) / 2;
 }
+

 // ES6 draft 09-27-13, section 20.2.2.12.
 function MathCosh(x) {
@@ -200,6 +290,7 @@
   if (!NUMBER_IS_FINITE(x)) return MathAbs(x);
   return (MathExp(x) + MathExp(-x)) / 2;
 }
+

 // ES6 draft 09-27-13, section 20.2.2.33.
 function MathTanh(x) {
@@ -212,6 +303,7 @@
   var exp2 = MathExp(-x);
   return (exp1 - exp2) / (exp1 + exp2);
 }
+

 // ES6 draft 09-27-13, section 20.2.2.5.
 function MathAsinh(x) {
@@ -222,6 +314,7 @@
   // This is to prevent numerical errors caused by large negative x.
   return -MathLog(-x + MathSqrt(x * x + 1));
 }
+

 // ES6 draft 09-27-13, section 20.2.2.3.
 function MathAcosh(x) {
@@ -231,6 +324,7 @@
   if (!NUMBER_IS_FINITE(x)) return x;
   return MathLog(x + MathSqrt(x + 1) * MathSqrt(x - 1));
 }
+

 // ES6 draft 09-27-13, section 20.2.2.7.
 function MathAtanh(x) {
@@ -241,6 +335,7 @@
   if (!NUMBER_IS_FINITE(x)) return NAN;
   return 0.5 * MathLog((1 + x) / (1 - x));
 }
+

 // ES6 draft 09-27-13, section 20.2.2.21.
 function MathLog10(x) {
@@ -252,6 +347,7 @@
 function MathLog2(x) {
   return MathLog(x) * 1.442695040888963407;  // log2(x) = log(x)/log(2).
 }
+

 // ES6 draft 09-27-13, section 20.2.2.17.
 function MathHypot(x, y) {  // Function length is 2.
@@ -284,13 +380,14 @@
   }
   return MathSqrt(sum) * max;
 }
+

 // ES6 draft 09-27-13, section 20.2.2.16.
 function MathFroundJS(x) {
   return %MathFround(TO_NUMBER_INLINE(x));
 }

-// ES6 draft 07-18-14, section 20.2.2.11
+
 function MathClz32(x) {
   x = ToUint32(TO_NUMBER_INLINE(x));
   if (x == 0) return 32;
@@ -303,6 +400,7 @@
   if ((x & 0x80000000) === 0) { x <<=  1; result +=  1; };
   return result;
 }
+

 // ES6 draft 09-27-13, section 20.2.2.9.
 // Cube root approximation, refer to: http://metamerist.com/cbrt/cbrt.htm
@@ -326,6 +424,8 @@
   approx = NEWTON_ITERATION_CBRT(x, approx);
   return NEWTON_ITERATION_CBRT(x, approx);
 }
+
+

 // ES6 draft 09-27-13, section 20.2.2.14.
 // Use Taylor series to approximate.
@@ -346,6 +446,7 @@
     return MathExp(x) - 1;
   }
 }
+

 // ES6 draft 09-27-13, section 20.2.2.20.
 // Use Taylor series to approximate. With y = x + 1;
@@ -401,14 +502,14 @@
     "asin", MathAsinJS,
     "atan", MathAtanJS,
     "ceil", MathCeil,
-    "cos", MathCos,       // implemented by third_party/fdlibm
+    "cos", MathCos,
     "exp", MathExp,
     "floor", MathFloor,
     "log", MathLog,
     "round", MathRound,
-    "sin", MathSin,       // implemented by third_party/fdlibm
+    "sin", MathSin,
     "sqrt", MathSqrt,
-    "tan", MathTan,       // implemented by third_party/fdlibm
+    "tan", MathTan,
     "atan2", MathAtan2JS,
     "pow", MathPow,
     "max", MathMax,
@@ -436,6 +537,8 @@
   %SetInlineBuiltinFlag(MathRandom);
   %SetInlineBuiltinFlag(MathSin);
   %SetInlineBuiltinFlag(MathCos);
+  %SetInlineBuiltinFlag(MathTan);
+  %SetInlineBuiltinFlag(TrigonometricInterpolation);
 }

 SetUpMath();
=======================================
--- /branches/bleeding_edge/src/runtime.cc      Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/src/runtime.cc      Wed Aug  6 11:04:47 2014 UTC
@@ -45,7 +45,6 @@
 #include "src/utils.h"
 #include "src/v8threads.h"
 #include "src/vm-state-inl.h"
-#include "third_party/fdlibm/fdlibm.h"

 #ifdef V8_I18N_SUPPORT
 #include "src/i18n.h"
@@ -7682,21 +7681,6 @@
   uint64_t result = (static_cast<uint64_t>(hi) << 32) | lo;
   return *isolate->factory()->NewNumber(uint64_to_double(result));
 }
-
-
-RUNTIME_FUNCTION(Runtime_RemPiO2) {
-  HandleScope handle_scope(isolate);
-  DCHECK(args.length() == 1);
-  CONVERT_DOUBLE_ARG_CHECKED(x, 0);
-  Factory* factory = isolate->factory();
-  double y[2];
-  int n = rempio2(x, y);
-  Handle<FixedArray> array = factory->NewFixedArray(3);
-  array->set(0, Smi::FromInt(n));
-  array->set(1, *factory->NewHeapNumber(y[0]));
-  array->set(2, *factory->NewHeapNumber(y[1]));
-  return *factory->NewJSArrayWithElements(array);
-}


 static const double kPiDividedBy4 = 0.78539816339744830962;
=======================================
--- /branches/bleeding_edge/src/runtime.h       Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/src/runtime.h       Wed Aug  6 11:04:47 2014 UTC
@@ -149,7 +149,6 @@
   F(MathExpRT, 1, 1)                                        \
   F(RoundNumber, 1, 1)                                      \
   F(MathFround, 1, 1)                                       \
-  F(RemPiO2, 1, 1)                                          \
                                                             \
   /* Regular expressions */                                 \
   F(RegExpCompile, 3, 1)                                    \
=======================================
--- /branches/bleeding_edge/test/mjsunit/debug-script.js Wed Aug 6 10:33:17 2014 UTC +++ /branches/bleeding_edge/test/mjsunit/debug-script.js Wed Aug 6 11:04:47 2014 UTC
@@ -59,7 +59,7 @@
 }

 // This has to be updated if the number of native scripts change.
-assertTrue(named_native_count == 23 || named_native_count == 24);
+assertTrue(named_native_count == 22 || named_native_count == 23);
 // Only the 'gc' extension is loaded.
 assertEquals(1, extension_count);
 // This script and mjsunit.js has been loaded.  If using d8, d8 loads
=======================================
--- /branches/bleeding_edge/test/mjsunit/mirror-script.js Wed Aug 6 10:33:17 2014 UTC +++ /branches/bleeding_edge/test/mjsunit/mirror-script.js Wed Aug 6 11:04:47 2014 UTC
@@ -84,7 +84,7 @@

 // Test the script mirror for different functions.
 testScriptMirror(function(){}, 'mirror-script.js', 98, 2, 0);
-testScriptMirror(Math.round, 'native math.js', -1, 0, 0);
+testScriptMirror(Math.sin, 'native math.js', -1, 0, 0);
testScriptMirror(eval('(function(){})'), null, 1, 2, 1, '(function(){})', 87); testScriptMirror(eval('(function(){\n })'), null, 2, 2, 1, '(function(){\n })', 88);

=======================================
--- /branches/bleeding_edge/test/mjsunit/sin-cos.js Wed Aug 6 10:33:17 2014 UTC +++ /branches/bleeding_edge/test/mjsunit/sin-cos.js Wed Aug 6 11:04:47 2014 UTC
@@ -157,8 +157,8 @@
 assertEquals(1, Math.cos("0x00000"));
 assertTrue(isNaN(Math.sin(Infinity)));
 assertTrue(isNaN(Math.cos("-Infinity")));
-assertTrue(Math.tan(Math.PI/2) > 1e16);
-assertTrue(Math.tan(-Math.PI/2) < -1e16);
+assertEquals("Infinity", String(Math.tan(Math.PI/2)));
+assertEquals("-Infinity", String(Math.tan(-Math.PI/2)));
 assertEquals("-Infinity", String(1/Math.sin("-0")));

 // Assert that the remainder after division by pi is reasonably precise.
@@ -185,96 +185,3 @@
 assertFalse(isNaN(Math.cos(1.57079632679489700)));
 assertFalse(isNaN(Math.cos(-1e-100)));
 assertFalse(isNaN(Math.cos(-1e-323)));
-
-// Tests for specific values expected from the fdlibm implementation.
-
-var two_32 = Math.pow(2, -32);
-var two_28 = Math.pow(2, -28);
-
-// Tests for Math.sin for |x| < pi/4
-assertEquals(Infinity, 1/Math.sin(+0.0));
-assertEquals(-Infinity, 1/Math.sin(-0.0));
-// sin(x) = x for x < 2^-27
-assertEquals(two_32, Math.sin(two_32));
-assertEquals(-two_32, Math.sin(-two_32));
-// sin(pi/8) = sqrt(sqrt(2)-1)/2^(3/4)
-assertEquals(0.3826834323650898, Math.sin(Math.PI/8));
-assertEquals(-0.3826834323650898, -Math.sin(Math.PI/8));
-
-// Tests for Math.cos for |x| < pi/4
-// cos(x) = 1 for |x| < 2^-27
-assertEquals(1, Math.cos(two_32));
-assertEquals(1, Math.cos(-two_32));
-// Test KERNELCOS for |x| < 0.3.
-// cos(pi/20) = sqrt(sqrt(2)*sqrt(sqrt(5)+5)+4)/2^(3/2)
-assertEquals(0.9876883405951378, Math.cos(Math.PI/20));
-// Test KERNELCOS for x ~= 0.78125
-assertEquals(0.7100335477927638, Math.cos(0.7812504768371582));
-assertEquals(0.7100338835660797, Math.cos(0.78125));
-// Test KERNELCOS for |x| > 0.3.
-// cos(pi/8) = sqrt(sqrt(2)+1)/2^(3/4)
-assertEquals(0.9238795325112867, Math.cos(Math.PI/8));
-// Test KERNELTAN for |x| < 0.67434.
-assertEquals(0.9238795325112867, Math.cos(-Math.PI/8));
-
-// Tests for Math.tan for |x| < pi/4
-assertEquals(Infinity, 1/Math.tan(0.0));
-assertEquals(-Infinity, 1/Math.tan(-0.0));
-// tan(x) = x for |x| < 2^-28
-assertEquals(two_32, Math.tan(two_32));
-assertEquals(-two_32, Math.tan(-two_32));
-// Test KERNELTAN for |x| > 0.67434.
-assertEquals(0.8211418015898941, Math.tan(11/16));
-assertEquals(-0.8211418015898941, Math.tan(-11/16));
-assertEquals(0.41421356237309503, Math.tan(Math.PI / 8));
-
-// Tests for Math.sin.
-assertEquals(0.479425538604203, Math.sin(0.5));
-assertEquals(-0.479425538604203, Math.sin(-0.5));
-assertEquals(1, Math.sin(Math.PI/2));
-assertEquals(-1, Math.sin(-Math.PI/2));
-// Test that Math.sin(Math.PI) != 0 since Math.PI is not exact.
-assertEquals(1.2246467991473532e-16, Math.sin(Math.PI));
-assertEquals(-7.047032979958965e-14, Math.sin(2200*Math.PI));
-// Test Math.sin for various phases.
-assertEquals(-0.7071067811865477, Math.sin(7/4 * Math.PI));
-assertEquals(0.7071067811865474, Math.sin(9/4 * Math.PI));
-assertEquals(0.7071067811865483, Math.sin(11/4 * Math.PI));
-assertEquals(-0.7071067811865479, Math.sin(13/4 * Math.PI));
-assertEquals(-3.2103381051568376e-11, Math.sin(1048576/4 * Math.PI));
-
-// Tests for Math.cos.
-assertEquals(1, Math.cos(two_28));
-// Cover different code paths in KERNELCOS.
-assertEquals(0.9689124217106447, Math.cos(0.25));
-assertEquals(0.8775825618903728, Math.cos(0.5));
-assertEquals(0.7073882691671998, Math.cos(0.785));
-// Test that Math.cos(Math.PI/2) != 0 since Math.PI is not exact.
-assertEquals(6.123233995736766e-17, Math.cos(Math.PI/2));
-// Test Math.cos for various phases.
-assertEquals(0.7071067811865474, Math.cos(7/4 * Math.PI));
-assertEquals(0.7071067811865477, Math.cos(9/4 * Math.PI));
-assertEquals(-0.7071067811865467, Math.cos(11/4 * Math.PI));
-assertEquals(-0.7071067811865471, Math.cos(13/4 * Math.PI));
-assertEquals(0.9367521275331447, Math.cos(1000000));
-assertEquals(-3.435757038074824e-12, Math.cos(1048575/2 * Math.PI));
-
-// Tests for Math.tan.
-assertEquals(two_28, Math.tan(two_28));
-// Test that  Math.tan(Math.PI/2) != Infinity since Math.PI is not exact.
-assertEquals(1.633123935319537e16, Math.tan(Math.PI/2));
-// Cover different code paths in KERNELTAN (tangent and cotangent)
-assertEquals(0.5463024898437905, Math.tan(0.5));
-assertEquals(2.0000000000000027, Math.tan(1.107148717794091));
-assertEquals(-1.0000000000000004, Math.tan(7/4*Math.PI));
-assertEquals(0.9999999999999994, Math.tan(9/4*Math.PI));
-assertEquals(-6.420676210313675e-11, Math.tan(1048576/2*Math.PI));
-assertEquals(2.910566692924059e11, Math.tan(1048575/2*Math.PI));
-
-// Test Hayne-Panek reduction.
-assertEquals(0.377820109360752e0, Math.sin(Math.pow(2, 120)));
-assertEquals(-0.9258790228548379e0, Math.cos(Math.pow(2, 120)));
-assertEquals(-0.40806638884180424e0, Math.tan(Math.pow(2, 120)));
-assertEquals(-0.377820109360752e0, Math.sin(-Math.pow(2, 120)));
-assertEquals(-0.9258790228548379e0, Math.cos(-Math.pow(2, 120)));
-assertEquals(0.40806638884180424e0, Math.tan(-Math.pow(2, 120)));
=======================================
--- /branches/bleeding_edge/test/test262/test262.status Wed Aug 6 10:33:17 2014 UTC +++ /branches/bleeding_edge/test/test262/test262.status Wed Aug 6 11:04:47 2014 UTC
@@ -68,7 +68,14 @@

   ##################### DELIBERATE INCOMPATIBILITIES #####################

+  # This tests precision of Math functions.  The implementation for those
+ # trigonometric functions are platform/compiler dependent. Furthermore, the
+  # expectation values by far deviates from the actual result given by an
+  # arbitrary-precision calculator, making those tests partly bogus.
+  'S15.8.2.7_A7': [PASS, FAIL_OK],  # Math.cos
'S15.8.2.8_A6': [PASS, FAIL_OK], # Math.exp (less precise with --fast-math)
+  'S15.8.2.16_A7': [PASS, FAIL_OK],  # Math.sin
+  'S15.8.2.18_A7': [PASS, FAIL_OK],  # Math.tan

   # Linux for ia32 (and therefore simulators) default to extended 80 bit
# floating point formats, so these tests checking 64-bit FP precision fail.
=======================================
--- /branches/bleeding_edge/tools/generate-runtime-tests.py Wed Aug 6 10:33:17 2014 UTC +++ /branches/bleeding_edge/tools/generate-runtime-tests.py Wed Aug 6 11:04:47 2014 UTC
@@ -47,11 +47,11 @@
# that the parser doesn't bit-rot. Change the values as needed when you add, # remove or change runtime functions, but make sure we don't lose our ability
 # to parse them!
-EXPECTED_FUNCTION_COUNT = 427
-EXPECTED_FUZZABLE_COUNT = 330
+EXPECTED_FUNCTION_COUNT = 426
+EXPECTED_FUZZABLE_COUNT = 329
 EXPECTED_CCTEST_COUNT = 7
 EXPECTED_UNKNOWN_COUNT = 16
-EXPECTED_BUILTINS_COUNT = 809
+EXPECTED_BUILTINS_COUNT = 813


 # Don't call these at all.
=======================================
--- /branches/bleeding_edge/tools/gyp/v8.gyp    Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/tools/gyp/v8.gyp    Wed Aug  6 11:04:47 2014 UTC
@@ -121,12 +121,14 @@
           'dependencies': [
             'mksnapshot#host',
             'js2c#host',
+            'generate_trig_table#host',
           ],
         }, {
           'toolsets': ['target'],
           'dependencies': [
             'mksnapshot',
             'js2c',
+            'generate_trig_table',
           ],
         }],
         ['component=="shared_library"', {
@@ -151,6 +153,7 @@
       'sources': [
         '<(SHARED_INTERMEDIATE_DIR)/libraries.cc',
         '<(SHARED_INTERMEDIATE_DIR)/experimental-libraries.cc',
+        '<(SHARED_INTERMEDIATE_DIR)/trig-table.cc',
         '<(INTERMEDIATE_DIR)/snapshot.cc',
         '../../src/snapshot-common.cc',
       ],
@@ -194,16 +197,17 @@
       'sources': [
         '<(SHARED_INTERMEDIATE_DIR)/libraries.cc',
         '<(SHARED_INTERMEDIATE_DIR)/experimental-libraries.cc',
+        '<(SHARED_INTERMEDIATE_DIR)/trig-table.cc',
         '../../src/snapshot-common.cc',
         '../../src/snapshot-empty.cc',
       ],
       'conditions': [
         ['want_separate_host_toolset==1', {
           'toolsets': ['host', 'target'],
-          'dependencies': ['js2c#host'],
+          'dependencies': ['js2c#host', 'generate_trig_table#host'],
         }, {
           'toolsets': ['target'],
-          'dependencies': ['js2c'],
+          'dependencies': ['js2c', 'generate_trig_table'],
         }],
         ['component=="shared_library"', {
           'defines': [
@@ -222,12 +226,14 @@
           'dependencies': [
             'mksnapshot#host',
             'js2c#host',
+            'generate_trig_table#host',
             'natives_blob#host',
         ]}, {
           'toolsets': ['target'],
           'dependencies': [
             'mksnapshot',
             'js2c',
+            'generate_trig_table',
             'natives_blob',
           ],
         }],
@@ -251,6 +257,7 @@
         '../..',
       ],
       'sources': [
+        '<(SHARED_INTERMEDIATE_DIR)/trig-table.cc',
         '../../src/natives-external.cc',
         '../../src/snapshot-external.cc',
       ],
@@ -284,6 +291,32 @@
         },
       ],
     },
+    { 'target_name': 'generate_trig_table',
+      'type': 'none',
+      'conditions': [
+        ['want_separate_host_toolset==1', {
+          'toolsets': ['host'],
+        }, {
+          'toolsets': ['target'],
+        }],
+      ],
+      'actions': [
+        {
+          'action_name': 'generate',
+          'inputs': [
+            '../../tools/generate-trig-table.py',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/trig-table.cc',
+          ],
+          'action': [
+            'python',
+            '../../tools/generate-trig-table.py',
+            '<@(_outputs)',
+          ],
+        },
+      ]
+    },
     {
       'target_name': 'v8_base',
       'type': 'static_library',
@@ -735,8 +768,6 @@
         '../../src/zone-inl.h',
         '../../src/zone.cc',
         '../../src/zone.h',
-        '../../third_party/fdlibm/fdlibm.cc',
-        '../../third_party/fdlibm/fdlibm.h',
       ],
       'conditions': [
         ['want_separate_host_toolset==1', {
@@ -1389,7 +1420,6 @@
           '../../src/array.js',
           '../../src/string.js',
           '../../src/uri.js',
-          '../../third_party/fdlibm/fdlibm.js',
           '../../src/math.js',
           '../../src/messages.js',
           '../../src/apinatives.js',
=======================================
--- /branches/bleeding_edge/tools/js2c.py       Wed Aug  6 10:33:17 2014 UTC
+++ /branches/bleeding_edge/tools/js2c.py       Wed Aug  6 11:04:47 2014 UTC
@@ -218,27 +218,6 @@
lines = ExpandMacroDefinition(lines, pos, name_pattern, macro, non_expander)


-INLINE_CONSTANT_PATTERN = re.compile(r'const\s+([a-zA-Z0-9_]+)\s*=\s*([^;\n]+)[;\n]')
-
-def ExpandInlineConstants(lines):
-  pos = 0
-  while True:
-    const_match = INLINE_CONSTANT_PATTERN.search(lines, pos)
-    if const_match is None:
-      # no more constants
-      return lines
-    name = const_match.group(1)
-    replacement = const_match.group(2)
-    name_pattern = re.compile("\\b%s\\b" % name)
-
-    # remove constant definition and replace
-    lines = (lines[:const_match.start()] +
-             re.sub(name_pattern, replacement, lines[const_match.end():]))
-
-    # advance position to where the constant defintion was
-    pos = const_match.start()
-
-
 HEADER_TEMPLATE = """\
 // Copyright 2011 Google Inc. All Rights Reserved.

@@ -354,7 +333,6 @@
   filter_chain.extend([
     RemoveCommentsAndTrailingWhitespace,
     ExpandInlineMacros,
-    ExpandInlineConstants,
     Validate,
     jsmin.JavaScriptMinifier().JSMinify
   ])

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to