Blame src/libmpg123/getcpuflags.h

Packit c32a2d
/*
Packit c32a2d
	getcpucpuflags: get cpuflags for ia32
Packit c32a2d
Packit c32a2d
	copyright ?-2007 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http:#mpg123.org
Packit c32a2d
	initially written by KIMURA Takuhiro (for 3DNow!)
Packit c32a2d
	extended for general use by Thomas Orgis
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#ifndef MPG123_H_GETCPUFLAGS
Packit c32a2d
#define MPG123_H_GETCPUFLAGS
Packit c32a2d
Packit c32a2d
/* standard level flags part 1 (ECX)*/
Packit c32a2d
#define FLAG_SSE3      0x00000001
Packit c32a2d
#define FLAG_SSSE3     0x00000200
Packit c32a2d
#define FLAG_AVX       0x1C000000
Packit c32a2d
/* standard level flags part 2 (EDX) */
Packit c32a2d
#define FLAG2_MMX       0x00800000
Packit c32a2d
#define FLAG2_SSE       0x02000000
Packit c32a2d
#define FLAG2_SSE2      0x04000000
Packit c32a2d
#define FLAG2_FPU       0x00000001
Packit c32a2d
/* cpuid extended level 1 (AMD) */
Packit c32a2d
#define XFLAG_MMX      0x00800000
Packit c32a2d
#define XFLAG_3DNOW    0x80000000
Packit c32a2d
#define XFLAG_3DNOWEXT 0x40000000
Packit c32a2d
/* eXtended Control Register 0 */
Packit c32a2d
#define XCR0FLAG_AVX   0x00000006
Packit c32a2d
Packit c32a2d
Packit c32a2d
struct cpuflags
Packit c32a2d
{
Packit c32a2d
#if defined(OPT_ARM) || defined(OPT_NEON) || defined(OPT_NEON64)
Packit c32a2d
	unsigned int has_neon;
Packit c32a2d
#else
Packit c32a2d
	unsigned int id;
Packit c32a2d
	unsigned int std;
Packit c32a2d
	unsigned int std2;
Packit c32a2d
	unsigned int ext;
Packit c32a2d
	unsigned int xcr0_lo;
Packit c32a2d
#endif
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
unsigned int getcpuflags(struct cpuflags* cf);
Packit c32a2d
Packit c32a2d
/* checks the family */
Packit c32a2d
#define cpu_i586(s) ( ((s.id & 0xf00)>>8) == 0 || ((s.id & 0xf00)>>8) > 4 )
Packit c32a2d
/* checking some flags... */
Packit c32a2d
#define cpu_fpu(s) (FLAG2_FPU & s.std2)
Packit c32a2d
#define cpu_mmx(s) (FLAG2_MMX & s.std2 || XFLAG_MMX & s.ext)
Packit c32a2d
#define cpu_3dnow(s) (XFLAG_3DNOW & s.ext)
Packit c32a2d
#define cpu_3dnowext(s) (XFLAG_3DNOWEXT & s.ext)
Packit c32a2d
#define cpu_sse(s) (FLAG2_SSE & s.std2)
Packit c32a2d
#define cpu_sse2(s) (FLAG2_SSE2 & s.std2)
Packit c32a2d
#define cpu_sse3(s) (FLAG_SSE3 & s.std)
Packit c32a2d
#define cpu_avx(s) ((FLAG_AVX & s.std) == FLAG_AVX && (XCR0FLAG_AVX & s.xcr0_lo) == XCR0FLAG_AVX)
Packit c32a2d
#define cpu_fast_sse(s) ((((s.id & 0xf00)>>8) == 6 && FLAG_SSSE3 & s.std) /* for Intel/VIA; family 6 CPUs with SSSE3 */ || \
Packit c32a2d
						   (((s.id & 0xf00)>>8) == 0xf && (((s.id & 0x0ff00000)>>20) > 0 && ((s.id & 0x0ff00000)>>20) != 5))) /* for AMD; family > 0xF CPUs except Bobcat */
Packit c32a2d
#define cpu_neon(s) (s.has_neon)
Packit c32a2d
Packit c32a2d
#endif