Reviewers: Mads Ager, Vladislav Kaznacheev,
Description:
Add a special case in Math.round for a SMI result. Also change the
implementation for non-SMI case.
http://compute3.aar:9013/golem/r4138-v8-olege-round-vs-4138-v8.html
Expect gain on http://compute3.aar:9013/golem/pinto-random.html
Please review this at http://codereview.chromium.org/981002
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/
Affected files:
M src/runtime.cc
Index: src/runtime.cc
===================================================================
--- src/runtime.cc (revision 4138)
+++ src/runtime.cc (working copy)
@@ -5323,12 +5323,21 @@
NoHandleAllocation ha;
ASSERT(args.length() == 1);
Counters::math_round.Increment();
+ CONVERT_DOUBLE_CHECKED(x, args[0]);
- CONVERT_DOUBLE_CHECKED(x, args[0]);
+ if (x > 0 && x < Smi::kMaxValue) {
+ return Smi::FromInt(static_cast<int>(x + 0.5));
+ }
+
if (signbit(x) && x >= -0.5) return Heap::minus_zero_value();
- double integer = ceil(x);
- if (integer - x > 0.5) { integer -= 1.0; }
- return Heap::NumberFromDouble(integer);
+
+ // if the magnitude is big enough, there's no place for fraction part.
If we
+ // try to add 0.5 to this number, 1.0 will be added instead.
+ if (x >= 9007199254740991.0 || x <= -9007199254740991.0) {
+ return Heap::NumberFromDouble(x);
+ }
+
+ return Heap::NumberFromDouble(floor(x + 0.5));
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev