Index: Source/wtf/CPU.h |
diff --git a/Source/wtf/CPU.h b/Source/wtf/CPU.h |
index 061d128afab82d7c4883c04f7e28a4d226e0e4a8..ada4d8521b5a1bfc3f44b644a086e17229978f60 100644 |
--- a/Source/wtf/CPU.h |
+++ b/Source/wtf/CPU.h |
@@ -2,7 +2,7 @@ |
* Copyright (C) 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights reserved. |
* Copyright (C) 2007-2009 Torch Mobile, Inc. |
* Copyright (C) 2010, 2011 Research In Motion Limited. All rights reserved. |
- * Copyright (C) 2013 Samsung Electronics. All rights reserved. |
+ * Copyright (C) 2013-2014 Samsung Electronics. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
@@ -155,12 +155,39 @@ |
# endif |
#endif /* !defined(WTF_CPU_ARM_THUMB2) */ |
-#if defined(__ARM_NEON__) && !defined(WTF_CPU_ARM_NEON) |
-#define WTF_CPU_ARM_NEON 1 |
+// The isSupportedNEON() function returns true if the target device |
+// is ARMv7-A and supports Neon instructions. In OPTIONAL mode, this actually |
+// probes the CPU at runtime (and caches the result). |
+#if CPU(ARM_NEON) |
+static inline bool isSupportedNEON(void) { return true; } |
+#elif CPU(ARM_NEON_OPTIONAL) |
+extern bool isSupportedNEON(void) WTF_PURE_FUNCTION; |
+#else |
+static inline bool isSupportedNEON(void) { return false; } |
+#endif |
+ |
+// Helper macro |
+#if CPU(ARM) |
+#define WTF_CPU_ARM_HAS_NEON() isSupportedNEON() |
+#endif |
+ |
+// Use WTF_CPU_ARM_NEON_WRAP(symbol) to map 'symbol' to a NEON-specific symbol |
+// when applicable. This will transform 'symbol' differently depending on |
+// the current NEON configuration, i.e.: |
+// |
+// NONE -> 'symbol' |
+// WTF_CPU_ARM_NEON -> 'symbolNEON' |
+// WTF_CPU_ARM_NEON_OPTIONAL -> 'symbol' or 'symbolNEON' depending on runtime check. |
+#if CPU(ARM_NEON) |
+# define WTF_CPU_ARM_NEON_WRAP(x) (x ## NEON) |
+#elif CPU(ARM_NEON_OPTIONAL) |
+# define WTF_CPU_ARM_NEON_WRAP(x) (WTF_CPU_ARM_HAS_NEON() ? x ## NEON : x) |
+#else |
+# define WTF_CPU_ARM_NEON_WRAP(x) (x) |
#endif |
-#if CPU(ARM_NEON) && (!COMPILER(GCC) || GCC_VERSION_AT_LEAST(4, 7, 0)) |
-// All NEON intrinsics usage can be disabled by this macro. |
+#if (CPU(ARM_NEON) || CPU(ARM_NEON_OPTIONAL)) && (!COMPILER(GCC) || GCC_VERSION_AT_LEAST(4, 7, 0)) |
+// All NEON intrinsics usage can be enabled by this macro. |
#define HAVE_ARM_NEON_INTRINSICS 1 |
#endif |