Detect CRC32 instructions on ARMv8.
authormtklein <mtklein@chromium.org>
Thu, 18 Aug 2016 22:59:08 +0000 (15:59 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 18 Aug 2016 22:59:08 +0000 (15:59 -0700)
I have successfully detected CRC32 instruction support on my Nexus 5x.

Use of these instructions to follow... I am not yet sure which compilers if any will give me instrinsics or let me write them in asm.

defined(__ARM_FEATURE_CRC32) should cover users like Android Framework who build with the best settings possible.  cpu-features.h covers use cases like Clank and our bots.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2259133002

Review-Url: https://codereview.chromium.org/2259133002

src/core/SkCpu.cpp
src/core/SkCpu.h

index 0858abd..0f1c751 100644 (file)
         return features;
     }
 
+#elif defined(SK_CPU_ARM64)         && \
+      defined(SK_BUILD_FOR_ANDROID) && \
+     !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK)
+    #include <cpu-features.h>
+
+    static uint32_t read_cpu_features() {
+        uint32_t features = 0;
+
+        uint64_t android_features = android_getCpuFeatures();
+        if (android_features & ANDROID_CPU_ARM64_FEATURE_CRC32) { features |= SkCpu::CRC32; }
+        return features;
+    }
+
 #else
     static uint32_t read_cpu_features() {
         return 0;
index 219ec69..4fba1d4 100644 (file)
@@ -27,6 +27,7 @@ struct SkCpu {
         NEON     = 1 << 0,
         NEON_FMA = 1 << 1,
         VFP_FP16 = 1 << 2,
+        CRC32    = 1 << 3,
     };
 
     static void CacheRuntimeFeatures();
@@ -79,6 +80,10 @@ inline bool SkCpu::Supports(uint32_t mask) {
     features |= NEON|NEON_FMA|VFP_FP16;
     #endif
 
+    #if defined(__ARM_FEATURE_CRC32)
+    features |= CRC32;
+    #endif
+
 #endif
     return (features & mask) == mask;
 }