diff options
author | Ian Rogers <irogers@google.com> | 2013-09-20 17:36:02 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2013-09-20 18:47:39 -0700 |
commit | 450dcb56ecbf6f729401e753f0a27e4170177ddd (patch) | |
tree | f596d57c5f6fbdc90b3dc68a2008e38ee48e2882 /runtime/entrypoints/entrypoint_utils.h | |
parent | 810b1d704f2db0d935bf5dddae3545f79cabd435 (diff) | |
download | art-450dcb56ecbf6f729401e753f0a27e4170177ddd.zip art-450dcb56ecbf6f729401e753f0a27e4170177ddd.tar.gz art-450dcb56ecbf6f729401e753f0a27e4170177ddd.tar.bz2 |
Improve float to integral conversion.
Change-Id: I1597083cb2c04084ce825fe2e3c753fde8309cd8
Diffstat (limited to 'runtime/entrypoints/entrypoint_utils.h')
-rw-r--r-- | runtime/entrypoints/entrypoint_utils.h | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/runtime/entrypoints/entrypoint_utils.h b/runtime/entrypoints/entrypoint_utils.h index 8b58cb3..fff7b71 100644 --- a/runtime/entrypoints/entrypoint_utils.h +++ b/runtime/entrypoints/entrypoint_utils.h @@ -16,7 +16,8 @@ #ifndef ART_RUNTIME_ENTRYPOINTS_ENTRYPOINT_UTILS_H_ #define ART_RUNTIME_ENTRYPOINTS_ENTRYPOINT_UTILS_H_ -#include "object_utils.h" + +#include "base/macros.h" #include "class_linker.h" #include "common_throws.h" #include "dex_file.h" @@ -27,6 +28,7 @@ #include "mirror/array.h" #include "mirror/class-inl.h" #include "mirror/throwable.h" +#include "object_utils.h" #include "thread.h" @@ -416,6 +418,23 @@ static inline void* GetJniDlsymLookupStub() { return reinterpret_cast<void*>(art_jni_dlsym_lookup_stub); } +template <typename INT_TYPE, typename FLOAT_TYPE> +static inline INT_TYPE art_float_to_integral(FLOAT_TYPE f) { + const INT_TYPE kMaxInt = static_cast<INT_TYPE>(std::numeric_limits<INT_TYPE>::max()); + const INT_TYPE kMinInt = static_cast<INT_TYPE>(std::numeric_limits<INT_TYPE>::min()); + const FLOAT_TYPE kMaxIntAsFloat = static_cast<FLOAT_TYPE>(kMaxInt); + const FLOAT_TYPE kMinIntAsFloat = static_cast<FLOAT_TYPE>(kMinInt); + if (LIKELY(f > kMinIntAsFloat)) { + if (LIKELY(f < kMaxIntAsFloat)) { + return static_cast<INT_TYPE>(f); + } else { + return kMaxInt; + } + } else { + return (f != f) ? 0 : kMinInt; // f != f implies NaN + } +} + } // namespace art #endif // ART_RUNTIME_ENTRYPOINTS_ENTRYPOINT_UTILS_H_ |