Path: blob/master/libs/mpg123/src/libmpg123/getcpuflags.h
4394 views
/*1getcpucpuflags: get cpuflags for ia3223copyright ?-2007 by the mpg123 project - free software under the terms of the LGPL 2.14see COPYING and AUTHORS files in distribution or http:#mpg123.org5initially written by KIMURA Takuhiro (for 3DNow!)6extended for general use by Thomas Orgis7*/89#ifndef MPG123_H_GETCPUFLAGS10#define MPG123_H_GETCPUFLAGS1112#include "config.h"1314/* standard level flags part 1 (ECX)*/15#define FLAG_SSE3 0x0000000116#define FLAG_SSSE3 0x0000020017#define FLAG_AVX 0x1C00000018/* standard level flags part 2 (EDX) */19#define FLAG2_MMX 0x0080000020#define FLAG2_SSE 0x0200000021#define FLAG2_SSE2 0x0400000022#define FLAG2_FPU 0x0000000123/* cpuid extended level 1 (AMD) */24#define XFLAG_MMX 0x0080000025#define XFLAG_3DNOW 0x8000000026#define XFLAG_3DNOWEXT 0x4000000027/* eXtended Control Register 0 */28#define XCR0FLAG_AVX 0x00000006293031struct cpuflags32{33#if defined(OPT_ARM) || defined(OPT_NEON) || defined(OPT_NEON64)34unsigned int has_neon;35#else36unsigned int id;37unsigned int std;38unsigned int std2;39unsigned int ext;40unsigned int xcr0_lo;41#endif42};4344unsigned int INT123_getcpuflags(struct cpuflags* cf);4546#if ((defined OPT_X86) || (defined OPT_X86_64) || (defined OPT_NEON) || (defined OPT_NEON64)) && (defined OPT_MULTI)4748#ifdef WANT_GETCPUFLAGS49#include <string.h>50// Wrapper needed for ignorant clang memory sanitizer that chokes51// because it does not know the assembly code intialized the vlaues.52static unsigned int wrap_getcpuflags(struct cpuflags* cf)53{54memset(cf, 0, sizeof(*cf));55return INT123_getcpuflags(cf);56}57#endif5859// We really evaluate the CPU flags.60#define OPT_CPU_FLAGS6162/* checks the family */63#define cpu_i586(s) ( ((s.id & 0xf00)>>8) == 0 || ((s.id & 0xf00)>>8) > 4 )64/* checking some flags... */65#define cpu_fpu(s) (FLAG2_FPU & s.std2)66#define cpu_mmx(s) (FLAG2_MMX & s.std2 || XFLAG_MMX & s.ext)67#define cpu_3dnow(s) (XFLAG_3DNOW & s.ext)68#define cpu_3dnowext(s) (XFLAG_3DNOWEXT & s.ext)69#define cpu_sse(s) (FLAG2_SSE & s.std2)70#define cpu_sse2(s) (FLAG2_SSE2 & s.std2)71#define cpu_sse3(s) (FLAG_SSE3 & s.std)72#define cpu_avx(s) ((FLAG_AVX & s.std) == FLAG_AVX && (XCR0FLAG_AVX & s.xcr0_lo) == XCR0FLAG_AVX)73#define cpu_fast_sse(s) ((((s.id & 0xf00)>>8) == 6 && FLAG_SSSE3 & s.std) /* for Intel/VIA; family 6 CPUs with SSSE3 */ || \74(((s.id & 0xf00)>>8) == 0xf && (((s.id & 0x0ff00000)>>20) > 0 && ((s.id & 0x0ff00000)>>20) != 5))) /* for AMD; family > 0xF CPUs except Bobcat */75#define cpu_neon(s) (s.has_neon)7677#else7879/* Faking stuff for non-multi builds. The same code for synth function choice is used.80Just no runtime dependency of result... */81#define cpu_flags nothing82#define cpu_i586(s) 183#define cpu_fpu(s) 184#define cpu_mmx(s) 185#define cpu_3dnow(s) 186#define cpu_3dnowext(s) 187#define cpu_sse(s) 188#define cpu_sse2(s) 189#define cpu_sse3(s) 190#define cpu_avx(s) 191#define cpu_neon(s) 19293#endif949596#endif979899