From f1b6030b44a4a9523183c3809a165b6b5353fff5 Mon Sep 17 00:00:00 2001 From: mtklein Date: Thu, 18 Aug 2016 15:59:08 -0700 Subject: [PATCH] Detect CRC32 instructions on ARMv8. 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 | 13 +++++++++++++ src/core/SkCpu.h | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/src/core/SkCpu.cpp b/src/core/SkCpu.cpp index 0858abd..0f1c751 100644 --- a/src/core/SkCpu.cpp +++ b/src/core/SkCpu.cpp @@ -71,6 +71,19 @@ return features; } +#elif defined(SK_CPU_ARM64) && \ + defined(SK_BUILD_FOR_ANDROID) && \ + !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) + #include + + 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; diff --git a/src/core/SkCpu.h b/src/core/SkCpu.h index 219ec69..4fba1d4 100644 --- a/src/core/SkCpu.h +++ b/src/core/SkCpu.h @@ -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; } -- 2.7.4