1 /* 2 * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "modules/audio_processing/agc2/cpu_features.h" 12 13 #include "rtc_base/strings/string_builder.h" 14 #include "rtc_base/system/arch.h" 15 #include "system_wrappers/include/cpu_features_wrapper.h" 16 17 namespace webrtc { 18 ToString() const19std::string AvailableCpuFeatures::ToString() const { 20 char buf[64]; 21 rtc::SimpleStringBuilder builder(buf); 22 bool first = true; 23 if (sse2) { 24 builder << (first ? "SSE2" : "_SSE2"); 25 first = false; 26 } 27 if (avx2) { 28 builder << (first ? "AVX2" : "_AVX2"); 29 first = false; 30 } 31 if (neon) { 32 builder << (first ? "NEON" : "_NEON"); 33 first = false; 34 } 35 if (first) { 36 return "none"; 37 } 38 return builder.str(); 39 } 40 41 // Detects available CPU features. GetAvailableCpuFeatures()42AvailableCpuFeatures GetAvailableCpuFeatures() { 43 #if defined(WEBRTC_ARCH_X86_FAMILY) 44 return {/*sse2=*/GetCPUInfo(kSSE2) != 0, 45 /*avx2=*/GetCPUInfo(kAVX2) != 0, 46 /*neon=*/false}; 47 #elif defined(WEBRTC_HAS_NEON) 48 return {/*sse2=*/false, 49 /*avx2=*/false, 50 /*neon=*/true}; 51 #else 52 return {/*sse2=*/false, 53 /*avx2=*/false, 54 /*neon=*/false}; 55 #endif 56 } 57 NoAvailableCpuFeatures()58AvailableCpuFeatures NoAvailableCpuFeatures() { 59 return {/*sse2=*/false, /*avx2=*/false, /*neon=*/false}; 60 } 61 62 } // namespace webrtc 63