From f08648dc4ce97339dd70c9e6b576cd8bb8153d9d Mon Sep 17 00:00:00 2001 From: "oleg@chromium.org" Date: Tue, 23 Mar 2010 12:48:42 +0000 Subject: [PATCH] Modify FastD2I to use static_cast instead of lrint(). Benchmarks show that it's much faster this way. Review URL: http://codereview.chromium.org/1128010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4223 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/conversions-inl.h | 18 ------------------ src/conversions.h | 7 ++++++- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/conversions-inl.h b/src/conversions-inl.h index 3037085..bf02947 100644 --- a/src/conversions-inl.h +++ b/src/conversions-inl.h @@ -41,24 +41,6 @@ namespace v8 { namespace internal { -// The fast double-to-int conversion routine does not guarantee -// rounding towards zero. -static inline int FastD2I(double x) { -#ifdef __USE_ISOC99 - // The ISO C99 standard defines the lrint() function which rounds a - // double to an integer according to the current rounding direction. - return lrint(x); -#else - // This is incredibly slow on Intel x86. The reason is that rounding - // towards zero is implied by the C standard. This means that the - // status register of the FPU has to be changed with the 'fldcw' - // instruction. This completely stalls the pipeline and takes many - // hundreds of clock cycles. - return static_cast(x); -#endif -} - - // The fast double-to-unsigned-int conversion routine does not guarantee // rounding towards zero, or any reasonable value if the argument is larger // than what fits in an unsigned 32-bit integer. diff --git a/src/conversions.h b/src/conversions.h index bdc7e44..4aaf0c0 100644 --- a/src/conversions.h +++ b/src/conversions.h @@ -36,7 +36,12 @@ namespace internal { // rounding towards zero. // The result is unspecified if x is infinite or NaN, or if the rounded // integer value is outside the range of type int. -static inline int FastD2I(double x); +static inline int FastD2I(double x) { + // The static_cast convertion from double to int used to be slow, but + // as new benchmarks show, now it is much faster than lrint(). + return static_cast(x); +} + static inline unsigned int FastD2UI(double x); -- 2.7.4