1*600f14f4SXin Li /* libFLAC - Free Lossless Audio Codec library 2*600f14f4SXin Li * Copyright (C) 2001-2009 Josh Coalson 3*600f14f4SXin Li * Copyright (C) 2011-2023 Xiph.Org Foundation 4*600f14f4SXin Li * 5*600f14f4SXin Li * Redistribution and use in source and binary forms, with or without 6*600f14f4SXin Li * modification, are permitted provided that the following conditions 7*600f14f4SXin Li * are met: 8*600f14f4SXin Li * 9*600f14f4SXin Li * - Redistributions of source code must retain the above copyright 10*600f14f4SXin Li * notice, this list of conditions and the following disclaimer. 11*600f14f4SXin Li * 12*600f14f4SXin Li * - Redistributions in binary form must reproduce the above copyright 13*600f14f4SXin Li * notice, this list of conditions and the following disclaimer in the 14*600f14f4SXin Li * documentation and/or other materials provided with the distribution. 15*600f14f4SXin Li * 16*600f14f4SXin Li * - Neither the name of the Xiph.org Foundation nor the names of its 17*600f14f4SXin Li * contributors may be used to endorse or promote products derived from 18*600f14f4SXin Li * this software without specific prior written permission. 19*600f14f4SXin Li * 20*600f14f4SXin Li * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21*600f14f4SXin Li * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*600f14f4SXin Li * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23*600f14f4SXin Li * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR 24*600f14f4SXin Li * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25*600f14f4SXin Li * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26*600f14f4SXin Li * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27*600f14f4SXin Li * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28*600f14f4SXin Li * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29*600f14f4SXin Li * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30*600f14f4SXin Li * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*600f14f4SXin Li */ 32*600f14f4SXin Li 33*600f14f4SXin Li #ifndef FLAC__PRIVATE__CPU_H 34*600f14f4SXin Li #define FLAC__PRIVATE__CPU_H 35*600f14f4SXin Li 36*600f14f4SXin Li #include "FLAC/ordinals.h" 37*600f14f4SXin Li 38*600f14f4SXin Li #ifdef HAVE_CONFIG_H 39*600f14f4SXin Li #include <config.h> 40*600f14f4SXin Li #endif 41*600f14f4SXin Li 42*600f14f4SXin Li #ifndef FLAC__CPU_X86_64 43*600f14f4SXin Li 44*600f14f4SXin Li #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) 45*600f14f4SXin Li #define FLAC__CPU_X86_64 46*600f14f4SXin Li #endif 47*600f14f4SXin Li 48*600f14f4SXin Li #endif 49*600f14f4SXin Li 50*600f14f4SXin Li #ifndef FLAC__CPU_IA32 51*600f14f4SXin Li 52*600f14f4SXin Li #if defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) ||defined( __i386) || defined(_M_IX86) 53*600f14f4SXin Li #define FLAC__CPU_IA32 54*600f14f4SXin Li #endif 55*600f14f4SXin Li 56*600f14f4SXin Li #endif 57*600f14f4SXin Li 58*600f14f4SXin Li #ifndef __has_attribute 59*600f14f4SXin Li #define __has_attribute(x) 0 60*600f14f4SXin Li #endif 61*600f14f4SXin Li 62*600f14f4SXin Li #if FLAC__HAS_X86INTRIN 63*600f14f4SXin Li /* SSE intrinsics support by ICC/MSVC/GCC */ 64*600f14f4SXin Li #if defined __INTEL_COMPILER 65*600f14f4SXin Li #define FLAC__SSE_TARGET(x) 66*600f14f4SXin Li #define FLAC__SSE_SUPPORTED 1 67*600f14f4SXin Li #define FLAC__SSE2_SUPPORTED 1 68*600f14f4SXin Li #if (__INTEL_COMPILER >= 1000) /* Intel C++ Compiler 10.0 */ 69*600f14f4SXin Li #define FLAC__SSSE3_SUPPORTED 1 70*600f14f4SXin Li #define FLAC__SSE4_1_SUPPORTED 1 71*600f14f4SXin Li #define FLAC__SSE4_2_SUPPORTED 1 72*600f14f4SXin Li #endif 73*600f14f4SXin Li #ifdef FLAC__USE_AVX 74*600f14f4SXin Li #if (__INTEL_COMPILER >= 1110) /* Intel C++ Compiler 11.1 */ 75*600f14f4SXin Li #define FLAC__AVX_SUPPORTED 1 76*600f14f4SXin Li #endif 77*600f14f4SXin Li #if (__INTEL_COMPILER >= 1300) /* Intel C++ Compiler 13.0 */ 78*600f14f4SXin Li #define FLAC__AVX2_SUPPORTED 1 79*600f14f4SXin Li #define FLAC__FMA_SUPPORTED 1 80*600f14f4SXin Li #endif 81*600f14f4SXin Li #endif 82*600f14f4SXin Li #elif defined __clang__ && __has_attribute(__target__) /* clang */ 83*600f14f4SXin Li #define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x))) 84*600f14f4SXin Li #define FLAC__SSE_SUPPORTED 1 85*600f14f4SXin Li #define FLAC__SSE2_SUPPORTED 1 86*600f14f4SXin Li #define FLAC__SSSE3_SUPPORTED 1 87*600f14f4SXin Li #define FLAC__SSE4_1_SUPPORTED 1 88*600f14f4SXin Li #define FLAC__SSE4_2_SUPPORTED 1 89*600f14f4SXin Li #ifdef FLAC__USE_AVX 90*600f14f4SXin Li #define FLAC__AVX_SUPPORTED 1 91*600f14f4SXin Li #define FLAC__AVX2_SUPPORTED 1 92*600f14f4SXin Li #define FLAC__FMA_SUPPORTED 1 93*600f14f4SXin Li #define FLAC__BMI2_SUPPORTED 1 94*600f14f4SXin Li #endif 95*600f14f4SXin Li #elif defined __GNUC__ && !defined __clang__ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) /* GCC 4.9+ */ 96*600f14f4SXin Li #define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x))) 97*600f14f4SXin Li #define FLAC__SSE_SUPPORTED 1 98*600f14f4SXin Li #define FLAC__SSE2_SUPPORTED 1 99*600f14f4SXin Li #define FLAC__SSSE3_SUPPORTED 1 100*600f14f4SXin Li #define FLAC__SSE4_1_SUPPORTED 1 101*600f14f4SXin Li #define FLAC__SSE4_2_SUPPORTED 1 102*600f14f4SXin Li #ifdef FLAC__USE_AVX 103*600f14f4SXin Li #define FLAC__AVX_SUPPORTED 1 104*600f14f4SXin Li #define FLAC__AVX2_SUPPORTED 1 105*600f14f4SXin Li #define FLAC__FMA_SUPPORTED 1 106*600f14f4SXin Li #define FLAC__BMI2_SUPPORTED 1 107*600f14f4SXin Li #endif 108*600f14f4SXin Li #elif defined _MSC_VER 109*600f14f4SXin Li #define FLAC__SSE_TARGET(x) 110*600f14f4SXin Li #define FLAC__SSE_SUPPORTED 1 111*600f14f4SXin Li #define FLAC__SSE2_SUPPORTED 1 112*600f14f4SXin Li #if (_MSC_VER >= 1500) /* MS Visual Studio 2008 */ 113*600f14f4SXin Li #define FLAC__SSSE3_SUPPORTED 1 114*600f14f4SXin Li #define FLAC__SSE4_1_SUPPORTED 1 115*600f14f4SXin Li #define FLAC__SSE4_2_SUPPORTED 1 116*600f14f4SXin Li #endif 117*600f14f4SXin Li #ifdef FLAC__USE_AVX 118*600f14f4SXin Li #if (_MSC_FULL_VER >= 160040219) /* MS Visual Studio 2010 SP1 */ 119*600f14f4SXin Li #define FLAC__AVX_SUPPORTED 1 120*600f14f4SXin Li #endif 121*600f14f4SXin Li #if (_MSC_VER >= 1700) /* MS Visual Studio 2012 */ 122*600f14f4SXin Li #define FLAC__AVX2_SUPPORTED 1 123*600f14f4SXin Li #define FLAC__FMA_SUPPORTED 1 124*600f14f4SXin Li #endif 125*600f14f4SXin Li #endif 126*600f14f4SXin Li #else 127*600f14f4SXin Li #define FLAC__SSE_TARGET(x) 128*600f14f4SXin Li #ifdef __SSE__ 129*600f14f4SXin Li #define FLAC__SSE_SUPPORTED 1 130*600f14f4SXin Li #endif 131*600f14f4SXin Li #ifdef __SSE2__ 132*600f14f4SXin Li #define FLAC__SSE2_SUPPORTED 1 133*600f14f4SXin Li #endif 134*600f14f4SXin Li #ifdef __SSSE3__ 135*600f14f4SXin Li #define FLAC__SSSE3_SUPPORTED 1 136*600f14f4SXin Li #endif 137*600f14f4SXin Li #ifdef __SSE4_1__ 138*600f14f4SXin Li #define FLAC__SSE4_1_SUPPORTED 1 139*600f14f4SXin Li #endif 140*600f14f4SXin Li #ifdef __SSE4_2__ 141*600f14f4SXin Li #define FLAC__SSE4_2_SUPPORTED 1 142*600f14f4SXin Li #endif 143*600f14f4SXin Li #ifdef FLAC__USE_AVX 144*600f14f4SXin Li #ifdef __AVX__ 145*600f14f4SXin Li #define FLAC__AVX_SUPPORTED 1 146*600f14f4SXin Li #endif 147*600f14f4SXin Li #ifdef __AVX2__ 148*600f14f4SXin Li #define FLAC__AVX2_SUPPORTED 1 149*600f14f4SXin Li #endif 150*600f14f4SXin Li #ifdef __FMA__ 151*600f14f4SXin Li #define FLAC__FMA_SUPPORTED 1 152*600f14f4SXin Li #endif 153*600f14f4SXin Li #endif 154*600f14f4SXin Li #endif /* compiler version */ 155*600f14f4SXin Li #endif /* intrinsics support */ 156*600f14f4SXin Li 157*600f14f4SXin Li 158*600f14f4SXin Li #ifndef FLAC__AVX_SUPPORTED 159*600f14f4SXin Li #define FLAC__AVX_SUPPORTED 0 160*600f14f4SXin Li #endif 161*600f14f4SXin Li 162*600f14f4SXin Li typedef enum { 163*600f14f4SXin Li FLAC__CPUINFO_TYPE_IA32, 164*600f14f4SXin Li FLAC__CPUINFO_TYPE_X86_64, 165*600f14f4SXin Li FLAC__CPUINFO_TYPE_UNKNOWN 166*600f14f4SXin Li } FLAC__CPUInfo_Type; 167*600f14f4SXin Li 168*600f14f4SXin Li typedef struct { 169*600f14f4SXin Li FLAC__bool intel; 170*600f14f4SXin Li 171*600f14f4SXin Li FLAC__bool cmov; 172*600f14f4SXin Li FLAC__bool mmx; 173*600f14f4SXin Li FLAC__bool sse; 174*600f14f4SXin Li FLAC__bool sse2; 175*600f14f4SXin Li 176*600f14f4SXin Li FLAC__bool sse3; 177*600f14f4SXin Li FLAC__bool ssse3; 178*600f14f4SXin Li FLAC__bool sse41; 179*600f14f4SXin Li FLAC__bool sse42; 180*600f14f4SXin Li FLAC__bool avx; 181*600f14f4SXin Li FLAC__bool avx2; 182*600f14f4SXin Li FLAC__bool fma; 183*600f14f4SXin Li FLAC__bool bmi2; 184*600f14f4SXin Li } FLAC__CPUInfo_x86; 185*600f14f4SXin Li 186*600f14f4SXin Li typedef struct { 187*600f14f4SXin Li FLAC__bool use_asm; 188*600f14f4SXin Li FLAC__CPUInfo_Type type; 189*600f14f4SXin Li FLAC__CPUInfo_x86 x86; 190*600f14f4SXin Li } FLAC__CPUInfo; 191*600f14f4SXin Li 192*600f14f4SXin Li void FLAC__cpu_info(FLAC__CPUInfo *info); 193*600f14f4SXin Li 194*600f14f4SXin Li FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32(void); 195*600f14f4SXin Li 196*600f14f4SXin Li void FLAC__cpu_info_asm_ia32(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx); 197*600f14f4SXin Li 198*600f14f4SXin Li #endif 199