Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(530)

Side by Side Diff: src/js/math.js

Issue 2102223005: [builtins] Migrate Math.hypot() to C++ builtins. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@MathAbs
Patch Set: Do not add Math.hypot() to list of optimized functions. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/builtins.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 (function(global, utils) { 5 (function(global, utils) {
6 "use strict"; 6 "use strict";
7 7
8 %CheckIsBootstrapping(); 8 %CheckIsBootstrapping();
9 9
10 // ------------------------------------------------------------------- 10 // -------------------------------------------------------------------
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 // ES6 draft 09-27-13, section 20.2.2.3. 60 // ES6 draft 09-27-13, section 20.2.2.3.
61 function MathAcosh(x) { 61 function MathAcosh(x) {
62 x = TO_NUMBER(x); 62 x = TO_NUMBER(x);
63 if (x < 1) return NaN; 63 if (x < 1) return NaN;
64 // Idempotent for NaN and +Infinity. 64 // Idempotent for NaN and +Infinity.
65 if (!NUMBER_IS_FINITE(x)) return x; 65 if (!NUMBER_IS_FINITE(x)) return x;
66 return %math_log(x + %math_sqrt(x + 1) * %math_sqrt(x - 1)); 66 return %math_log(x + %math_sqrt(x + 1) * %math_sqrt(x - 1));
67 } 67 }
68 68
69 // ES6 draft 09-27-13, section 20.2.2.17.
70 function MathHypot(x, y) { // Function length is 2.
71 // We may want to introduce fast paths for two arguments and when
72 // normalization to avoid overflow is not necessary. For now, we
73 // simply assume the general case.
74 var length = arguments.length;
75 var max = 0;
76 for (var i = 0; i < length; i++) {
77 var n = %math_abs(arguments[i]);
78 if (n > max) max = n;
79 arguments[i] = n;
80 }
81 if (max === INFINITY) return INFINITY;
82
83 // Kahan summation to avoid rounding errors.
84 // Normalize the numbers to the largest one to avoid overflow.
85 if (max === 0) max = 1;
86 var sum = 0;
87 var compensation = 0;
88 for (var i = 0; i < length; i++) {
89 var n = arguments[i] / max;
90 var summand = n * n - compensation;
91 var preliminary = sum + summand;
92 compensation = (preliminary - sum) - summand;
93 sum = preliminary;
94 }
95 return %math_sqrt(sum) * max;
96 }
97 69
98 // ------------------------------------------------------------------- 70 // -------------------------------------------------------------------
99 71
100 %AddNamedProperty(GlobalMath, toStringTagSymbol, "Math", READ_ONLY | DONT_ENUM); 72 %AddNamedProperty(GlobalMath, toStringTagSymbol, "Math", READ_ONLY | DONT_ENUM);
101 73
102 // Set up math constants. 74 // Set up math constants.
103 utils.InstallConstants(GlobalMath, [ 75 utils.InstallConstants(GlobalMath, [
104 "PI", 3.1415926535897932, 76 "PI", 3.1415926535897932,
105 "SQRT1_2", 0.7071067811865476, 77 "SQRT1_2", 0.7071067811865476,
106 "SQRT2", 1.4142135623730951 78 "SQRT2", 1.4142135623730951
107 ]); 79 ]);
108 80
109 // Set up non-enumerable functions of the Math object and 81 // Set up non-enumerable functions of the Math object and
110 // set their names. 82 // set their names.
111 utils.InstallFunctions(GlobalMath, DONT_ENUM, [ 83 utils.InstallFunctions(GlobalMath, DONT_ENUM, [
112 "random", MathRandom, 84 "random", MathRandom,
113 "sign", MathSign, 85 "sign", MathSign,
114 "asinh", MathAsinh, 86 "asinh", MathAsinh,
115 "acosh", MathAcosh, 87 "acosh", MathAcosh
116 "hypot", MathHypot,
117 ]); 88 ]);
118 89
119 %SetForceInlineFlag(MathRandom); 90 %SetForceInlineFlag(MathRandom);
120 %SetForceInlineFlag(MathSign); 91 %SetForceInlineFlag(MathSign);
121 92
122 // ------------------------------------------------------------------- 93 // -------------------------------------------------------------------
123 // Exports 94 // Exports
124 95
125 utils.Export(function(to) { 96 utils.Export(function(to) {
126 to.MathRandom = MathRandom; 97 to.MathRandom = MathRandom;
127 }); 98 });
128 99
129 }) 100 })
OLDNEW
« no previous file with comments | « src/builtins.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698