1fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org"use strict";
6a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org
7e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// This file relies on the fact that the following declarations have been made
8e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// in runtime.js:
9e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// var $Object = global.Object;
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Keep reference to original values of some global properties.  This
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// has the added benefit that the code in this file is isolated from
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// changes to these properties.
14f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $floor = MathFloor;
15f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $abs = MathAbs;
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Instance class name can only be set on functions. That is the only
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// purpose for MathConstructor.
1941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgfunction MathConstructor() {}
20f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $Math = new MathConstructor();
21e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
22e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// -------------------------------------------------------------------
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.1
2541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgfunction MathAbs(x) {
26eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (%_IsSmi(x)) return x >= 0 ? x : -x;
27e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org  x = TO_NUMBER_INLINE(x);
28f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  if (x === 0) return 0;  // To handle -0.
29f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  return x > 0 ? x : -x;
30769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com}
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.2
33285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction MathAcosJS(x) {
342f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  return %MathAcos(TO_NUMBER_INLINE(x));
35eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.3
38285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction MathAsinJS(x) {
392f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  return %MathAsin(TO_NUMBER_INLINE(x));
40eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.4
43285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction MathAtanJS(x) {
442f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  return %MathAtan(TO_NUMBER_INLINE(x));
45eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.5
4868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org// The naming of y and x matches the spec, as does the order in which
4968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org// ToNumber (valueOf) is called.
50aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.orgfunction MathAtan2JS(y, x) {
512f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  return %MathAtan2(TO_NUMBER_INLINE(y), TO_NUMBER_INLINE(x));
52eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.6
55eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathCeil(x) {
5637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  return -MathFloor(-x);
57eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.8
60eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathExp(x) {
61aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  return %MathExpRT(TO_NUMBER_INLINE(x));
62eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.9
65eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathFloor(x) {
66e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org  x = TO_NUMBER_INLINE(x);
6786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  // It's more common to call this with a positive number that's out
6886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  // of range than negative numbers; check the upper bound first.
690c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  if (x < 0x80000000 && x > 0) {
70eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // Numbers in the range [0, 2^31) can be floored by converting
71eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // them to an unsigned 32-bit value using the shift operator.
72eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // We avoid doing so for -0, because the result of Math.floor(-0)
73eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // has to be -0, which wouldn't be the case with the shift.
740c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org    return TO_UINT32(x);
75eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  } else {
76aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    return %MathFloorRT(x);
77eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
78eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.10
81eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathLog(x) {
82285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  return %_MathLogRT(TO_NUMBER_INLINE(x));
83eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.11
8641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgfunction MathMax(arg1, arg2) {  // length == 2
8768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var length = %_ArgumentsLength();
88fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  if (length == 2) {
89e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org    arg1 = TO_NUMBER_INLINE(arg1);
90e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org    arg2 = TO_NUMBER_INLINE(arg2);
91fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    if (arg2 > arg1) return arg2;
92fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    if (arg1 > arg2) return arg1;
93fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    if (arg1 == arg2) {
940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      // Make sure -0 is considered less than +0.
950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      return (arg1 === 0 && %_IsMinusZero(arg1)) ? arg2 : arg1;
96fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    }
97fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    // All comparisons failed, one of the arguments must be NaN.
98690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    return NAN;
99fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  }
100690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  var r = -INFINITY;
10132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  for (var i = 0; i < length; i++) {
10213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    var n = %_Arguments(i);
103d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (!IS_NUMBER(n)) n = NonNumberToNumber(n);
1040cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    // Make sure +0 is considered greater than -0.
1050cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    if (NUMBER_IS_NAN(n) || n > r || (r === 0 && n === 0 && %_IsMinusZero(r))) {
10632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      r = n;
10732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    }
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return r;
11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.12
11341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.orgfunction MathMin(arg1, arg2) {  // length == 2
11468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var length = %_ArgumentsLength();
115fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  if (length == 2) {
116e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org    arg1 = TO_NUMBER_INLINE(arg1);
117e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org    arg2 = TO_NUMBER_INLINE(arg2);
118fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    if (arg2 > arg1) return arg1;
119fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    if (arg1 > arg2) return arg2;
120fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    if (arg1 == arg2) {
1210cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      // Make sure -0 is considered less than +0.
1220cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      return (arg1 === 0 && %_IsMinusZero(arg1)) ? arg1 : arg2;
123fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    }
124fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    // All comparisons failed, one of the arguments must be NaN.
125690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    return NAN;
126fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  }
127690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  var r = INFINITY;
12832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  for (var i = 0; i < length; i++) {
12913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    var n = %_Arguments(i);
130d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (!IS_NUMBER(n)) n = NonNumberToNumber(n);
1310cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    // Make sure -0 is considered less than +0.
1320cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    if (NUMBER_IS_NAN(n) || n < r || (r === 0 && n === 0 && %_IsMinusZero(n))) {
13332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      r = n;
13432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    }
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return r;
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.13
140eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathPow(x, y) {
141e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org  return %_MathPow(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y));
142eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
14341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
14441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.14
145f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgvar rngstate;  // Initialized to a Uint32Array during genesis.
146eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathRandom() {
147f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  var r0 = (MathImul(18273, rngstate[0] & 0xFFFF) + (rngstate[0] >>> 16)) | 0;
148f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  rngstate[0] = r0;
149f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  var r1 = (MathImul(36969, rngstate[1] & 0xFFFF) + (rngstate[1] >>> 16)) | 0;
150f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  rngstate[1] = r1;
151f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  var x = ((r0 << 16) + (r1 & 0xFFFF)) | 0;
152f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  // Division by 0x100000000 through multiplication by reciprocal.
153f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  return (x < 0 ? (x + 0x100000000) : x) * 2.3283064365386962890625e-10;
154eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
15541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
15641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.15
157eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathRound(x) {
158e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org  return %RoundNumber(TO_NUMBER_INLINE(x));
159eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
16041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
16141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// ECMA 262 - 15.8.2.17
162eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MathSqrt(x) {
163aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  return %_MathSqrtRT(TO_NUMBER_INLINE(x));
164eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
16541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
166ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// Non-standard extension.
167ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgfunction MathImul(x, y) {
168e7a07450b06d405206bf210de0aa6bbb440ab9a7bmeurer@chromium.org  return %NumberImul(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y));
169ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org}
170ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.28.
1724c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathSign(x) {
1734c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  x = TO_NUMBER_INLINE(x);
1744c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x > 0) return 1;
1754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x < 0) return -1;
1765fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org  // -0, 0 or NaN.
1775fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org  return x;
1784c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
1794c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.34.
1814c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathTrunc(x) {
1824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  x = TO_NUMBER_INLINE(x);
1834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x > 0) return MathFloor(x);
1844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x < 0) return MathCeil(x);
1855fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org  // -0, 0 or NaN.
1865fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org  return x;
1874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
1884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
1894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.33.
1904c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathTanh(x) {
1914c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
1924c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Idempotent for +/-0.
1934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x === 0) return x;
1944c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Returns +/-1 for +/-Infinity.
1954c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (!NUMBER_IS_FINITE(x)) return MathSign(x);
1964c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var exp1 = MathExp(x);
1974c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var exp2 = MathExp(-x);
1984c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return (exp1 - exp2) / (exp1 + exp2);
1994c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.5.
2024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathAsinh(x) {
2034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
2044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Idempotent for NaN, +/-0 and +/-Infinity.
2054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x === 0 || !NUMBER_IS_FINITE(x)) return x;
2064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x > 0) return MathLog(x + MathSqrt(x * x + 1));
2074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // This is to prevent numerical errors caused by large negative x.
2084c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return -MathLog(-x + MathSqrt(x * x + 1));
2094c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.3.
2124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathAcosh(x) {
2134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
2144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x < 1) return NAN;
2154c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Idempotent for NaN and +Infinity.
2164c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (!NUMBER_IS_FINITE(x)) return x;
2174c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return MathLog(x + MathSqrt(x + 1) * MathSqrt(x - 1));
2184c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2194c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2204c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.7.
2214c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathAtanh(x) {
2224c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
2234c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Idempotent for +/-0.
2244c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x === 0) return x;
2254c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Returns NaN for NaN and +/- Infinity.
2264c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (!NUMBER_IS_FINITE(x)) return NAN;
2274c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return 0.5 * MathLog((1 + x) / (1 - x));
2284c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2294c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.21.
2314c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathLog10(x) {
2324c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return MathLog(x) * 0.434294481903251828;  // log10(x) = log(x)/log(10).
2334c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2344c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2354c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2364c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.22.
2374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathLog2(x) {
2384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return MathLog(x) * 1.442695040888963407;  // log2(x) = log(x)/log(2).
2394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.17.
2424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathHypot(x, y) {  // Function length is 2.
2434c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // We may want to introduce fast paths for two arguments and when
2444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // normalization to avoid overflow is not necessary.  For now, we
2454c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // simply assume the general case.
2464c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var length = %_ArgumentsLength();
2474c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var args = new InternalArray(length);
2484c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var max = 0;
2494c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  for (var i = 0; i < length; i++) {
2504c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    var n = %_Arguments(i);
2514c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if (!IS_NUMBER(n)) n = NonNumberToNumber(n);
2524c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if (n === INFINITY || n === -INFINITY) return INFINITY;
2534c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    n = MathAbs(n);
2544c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    if (n > max) max = n;
2554c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    args[i] = n;
2564c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  }
2574c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2584c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Kahan summation to avoid rounding errors.
2594c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Normalize the numbers to the largest one to avoid overflow.
2604c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (max === 0) max = 1;
2614c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var sum = 0;
2624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var compensation = 0;
2634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  for (var i = 0; i < length; i++) {
2644c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    var n = args[i] / max;
2654c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    var summand = n * n - compensation;
2664c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    var preliminary = sum + summand;
2674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    compensation = (preliminary - sum) - summand;
2684c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    sum = preliminary;
2694c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  }
2704c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return MathSqrt(sum) * max;
2714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2724c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2734c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.16.
2744c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathFroundJS(x) {
2754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return %MathFround(TO_NUMBER_INLINE(x));
2764c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2774c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2789d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// ES6 draft 07-18-14, section 20.2.2.11
2794c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathClz32(x) {
2804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  x = ToUint32(TO_NUMBER_INLINE(x));
2814c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x == 0) return 32;
2824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var result = 0;
2834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  // Binary search.
2844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if ((x & 0xFFFF0000) === 0) { x <<= 16; result += 16; };
2854c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if ((x & 0xFF000000) === 0) { x <<=  8; result +=  8; };
2864c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if ((x & 0xF0000000) === 0) { x <<=  4; result +=  4; };
2874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if ((x & 0xC0000000) === 0) { x <<=  2; result +=  2; };
2884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if ((x & 0x80000000) === 0) { x <<=  1; result +=  1; };
2894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return result;
2904c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
2914c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
2924c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// ES6 draft 09-27-13, section 20.2.2.9.
2934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// Cube root approximation, refer to: http://metamerist.com/cbrt/cbrt.htm
2944c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// Using initial approximation adapted from Kahan's cbrt and 4 iterations
2954c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org// of Newton's method.
2964c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction MathCbrt(x) {
2974c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
2984c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  if (x == 0 || !NUMBER_IS_FINITE(x)) return x;
2994c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return x >= 0 ? CubeRoot(x) : -CubeRoot(-x);
3004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
3014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
3024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgmacro NEWTON_ITERATION_CBRT(x, approx)
3034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  (1.0 / 3.0) * (x / (approx * approx) + 2 * approx);
3044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgendmacro
3054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
3064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.orgfunction CubeRoot(x) {
3074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var approx_hi = MathFloor(%_DoubleHi(x) / 3) + 0x2A9F7893;
3084c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  var approx = %_ConstructDouble(approx_hi, 0);
3094c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  approx = NEWTON_ITERATION_CBRT(x, approx);
3104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  approx = NEWTON_ITERATION_CBRT(x, approx);
3114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  approx = NEWTON_ITERATION_CBRT(x, approx);
3124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  return NEWTON_ITERATION_CBRT(x, approx);
3134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org}
3144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
31541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org// -------------------------------------------------------------------
31641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
3171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SetUpMath() {
3181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  %CheckIsBootstrapping();
319e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
32031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  %InternalSetPrototype($Math, $Object.prototype);
3219bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  %AddNamedProperty(global, "Math", $Math, DONT_ENUM);
322e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  %FunctionSetInstanceClassName(MathConstructor, 'Math');
323e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
3241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // Set up math constants.
3254610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  InstallConstants($Math, $Array(
3264610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    // ECMA-262, section 15.8.1.1.
3274610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    "E", 2.7182818284590452354,
3284610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    // ECMA-262, section 15.8.1.2.
3294610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    "LN10", 2.302585092994046,
3304610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    // ECMA-262, section 15.8.1.3.
3314610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    "LN2", 0.6931471805599453,
3324610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    // ECMA-262, section 15.8.1.4.
3334610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    "LOG2E", 1.4426950408889634,
3344610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    "LOG10E", 0.4342944819032518,
3354610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    "PI", 3.1415926535897932,
3364610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    "SQRT1_2", 0.7071067811865476,
3374610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    "SQRT2", 1.4142135623730951
3384610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  ));
33941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
3401805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // Set up non-enumerable functions of the Math object and
34141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  // set their names.
34227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  InstallFunctions($Math, DONT_ENUM, $Array(
34341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "random", MathRandom,
34441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "abs", MathAbs,
345285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "acos", MathAcosJS,
346285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "asin", MathAsinJS,
347285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "atan", MathAtanJS,
34841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "ceil", MathCeil,
3499d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    "cos", MathCos,       // implemented by third_party/fdlibm
35041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "exp", MathExp,
35141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "floor", MathFloor,
35241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "log", MathLog,
35341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "round", MathRound,
3549d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    "sin", MathSin,       // implemented by third_party/fdlibm
35541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "sqrt", MathSqrt,
3569d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    "tan", MathTan,       // implemented by third_party/fdlibm
357aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    "atan2", MathAtan2JS,
35841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "pow", MathPow,
35941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    "max", MathMax,
360ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    "min", MathMin,
3614c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "imul", MathImul,
3624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "sign", MathSign,
3634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "trunc", MathTrunc,
364d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org    "sinh", MathSinh,     // implemented by third_party/fdlibm
365ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    "cosh", MathCosh,     // implemented by third_party/fdlibm
3664c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "tanh", MathTanh,
3674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "asinh", MathAsinh,
3684c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "acosh", MathAcosh,
3694c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "atanh", MathAtanh,
3704c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "log10", MathLog10,
3714c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "log2", MathLog2,
3724c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "hypot", MathHypot,
3734c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "fround", MathFroundJS,
3744c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "clz32", MathClz32,
3754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    "cbrt", MathCbrt,
376e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org    "log1p", MathLog1p,   // implemented by third_party/fdlibm
377e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org    "expm1", MathExpm1    // implemented by third_party/fdlibm
37841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org  ));
3790cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
38037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  %SetInlineBuiltinFlag(MathCeil);
38137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  %SetInlineBuiltinFlag(MathRandom);
3820cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  %SetInlineBuiltinFlag(MathSin);
3830cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  %SetInlineBuiltinFlag(MathCos);
3841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org}
38541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
3861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpMath();
387