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

Unified Diff: src/runtime/runtime-typedarray.cc

Issue 2726153003: [typedarrays] No callbacks for fast sorting of integer typed arrays (Closed)
Patch Set: static casting to double Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime/runtime-typedarray.cc
diff --git a/src/runtime/runtime-typedarray.cc b/src/runtime/runtime-typedarray.cc
index f4643e0506337e84b37ce2214dc817559e2eb834..a057fc69bd40bf38efb561ed1480259d1779d680 100644
--- a/src/runtime/runtime-typedarray.cc
+++ b/src/runtime/runtime-typedarray.cc
@@ -336,27 +336,24 @@ RUNTIME_FUNCTION(Runtime_TypedArraySetFastCases) {
namespace {
-#define TYPED_ARRAY_SORT_COMPAREFN(Type, type, TYPE, ctype, size) \
- bool compare##Type(ctype x, ctype y) { \
- if (x < y) { \
- return true; \
- } else if (x > y) { \
- return false; \
- } else { \
- double _x = x, _y = y; \
- if (x == 0 && x == y) { \
- /* -0.0 is less than +0.0 */ \
- return std::signbit(_x) && !std::signbit(_y); \
- } else if (!std::isnan(_x) && std::isnan(_y)) { \
- /* number is less than NaN */ \
- return true; \
- } \
- } \
- return false; \
+template <typename T>
+bool CompareNum(T x, T y) {
+ if (x < y) {
+ return true;
+ } else if (x > y) {
+ return false;
+ } else if (!std::is_integral<T>::value) {
+ double _x = x, _y = y;
+ if (x == 0 && x == y) {
+ /* -0.0 is less than +0.0 */
+ return std::signbit(_x) && !std::signbit(_y);
+ } else if (!std::isnan(_x) && std::isnan(_y)) {
+ /* number is less than NaN */
+ return true;
+ }
}
-
-TYPED_ARRAYS(TYPED_ARRAY_SORT_COMPAREFN)
-#undef TYPED_ARRAY_SORT_COMPAREFN
+ return false;
+}
} // namespace
@@ -376,15 +373,19 @@ RUNTIME_FUNCTION(Runtime_TypedArraySortFast) {
if (V8_UNLIKELY(array->WasNeutered())) return *array;
size_t length = array->length_value();
- if (length == 0) return *array;
+ if (length <= 1) return *array;
switch (array->type()) {
-#define TYPED_ARRAY_SORT(Type, type, TYPE, ctype, size) \
- case kExternal##Type##Array: { \
- ctype* backing_store = \
- static_cast<ctype*>(array->GetBuffer()->backing_store()); \
- std::sort(backing_store, backing_store + length, compare##Type); \
- break; \
+#define TYPED_ARRAY_SORT(Type, type, TYPE, ctype, size) \
+ case kExternal##Type##Array: { \
+ ctype* backing_store = \
+ static_cast<ctype*>(array->GetBuffer()->backing_store()); \
+ if (kExternal##Type##Array == kExternalFloat64Array || \
+ kExternal##Type##Array == kExternalFloat32Array) \
+ std::sort(backing_store, backing_store + length, CompareNum<ctype>); \
+ else \
+ std::sort(backing_store, backing_store + length); \
+ break; \
}
TYPED_ARRAYS(TYPED_ARRAY_SORT)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698