summaryrefslogtreecommitdiffstats
path: root/runtime/entrypoints/entrypoint_utils.h
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2013-09-20 17:36:02 -0700
committerIan Rogers <irogers@google.com>2013-09-20 18:47:39 -0700
commit450dcb56ecbf6f729401e753f0a27e4170177ddd (patch)
treef596d57c5f6fbdc90b3dc68a2008e38ee48e2882 /runtime/entrypoints/entrypoint_utils.h
parent810b1d704f2db0d935bf5dddae3545f79cabd435 (diff)
downloadart-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.h21
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_