cpu.h 4.54 KB
Newer Older
Josh Coalson's avatar
Josh Coalson committed
1
/* libFLAC - Free Lossless Audio Codec library
2
3
 * Copyright (C) 2001-2009  Josh Coalson
 * Copyright (C) 2011-2013  Xiph.Org Foundation
Josh Coalson's avatar
Josh Coalson committed
4
 *
5
6
7
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
Josh Coalson's avatar
Josh Coalson committed
8
 *
9
10
 * - Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
Josh Coalson's avatar
Josh Coalson committed
11
 *
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 * - Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 *
 * - Neither the name of the Xiph.org Foundation nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Josh Coalson's avatar
Josh Coalson committed
31
32
33
34
35
36
37
 */

#ifndef FLAC__PRIVATE__CPU_H
#define FLAC__PRIVATE__CPU_H

#include "FLAC/ordinals.h"

Josh Coalson's avatar
Josh Coalson committed
38
39
40
41
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* SSE intrinsics support by ICC/MSVC/GCC */
#if defined __INTEL_COMPILER
  #define FLAC__SSE_TARGET(x)
  #define FLAC__SSE_SUPPORTED 1
  #define FLAC__SSE2_SUPPORTED 1
  #if (__INTEL_COMPILER >= 1000) /* Intel C++ Compiler 10.0 */
    #define FLAC__SSSE3_SUPPORTED 1
    #define FLAC__SSE4_1_SUPPORTED 1
  #endif
#elif defined _MSC_VER
  #define FLAC__SSE_TARGET(x)
  #define FLAC__SSE_SUPPORTED 1
  #define FLAC__SSE2_SUPPORTED 1
  #if (_MSC_VER >= 1500) /* MS Visual Studio 2008 */
    #define FLAC__SSSE3_SUPPORTED 1
    #define FLAC__SSE4_1_SUPPORTED 1
  #endif
#elif defined __GNUC__
  #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) /* since GCC 4.9 -msse.. compiler options aren't necessary */
    #define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x)))
    #define FLAC__SSE_SUPPORTED 1
    #define FLAC__SSE2_SUPPORTED 1
    #define FLAC__SSSE3_SUPPORTED 1
    #define FLAC__SSE4_1_SUPPORTED 1
  #else /* for GCC older than 4.9 */
    #define FLAC__SSE_TARGET(x)
    #ifdef __SSE__
      #define FLAC__SSE_SUPPORTED 1
    #endif
    #ifdef __SSE2__
      #define FLAC__SSE2_SUPPORTED 1
    #endif
    #ifdef __SSSE3__
      #define FLAC__SSSE3_SUPPORTED 1
    #endif
    #ifdef __SSE4_1__
      #define FLAC__SSE4_1_SUPPORTED 1
    #endif
  #endif /* GCC version */
#endif /* compiler version */

Josh Coalson's avatar
Josh Coalson committed
83
84
typedef enum {
	FLAC__CPUINFO_TYPE_IA32,
85
	FLAC__CPUINFO_TYPE_X86_64,
86
	FLAC__CPUINFO_TYPE_PPC,
Josh Coalson's avatar
Josh Coalson committed
87
88
89
	FLAC__CPUINFO_TYPE_UNKNOWN
} FLAC__CPUInfo_Type;

90
#if defined FLAC__CPU_IA32
Josh Coalson's avatar
Josh Coalson committed
91
typedef struct {
92
93
	FLAC__bool cpuid;
	FLAC__bool bswap;
Josh Coalson's avatar
Josh Coalson committed
94
95
96
97
98
	FLAC__bool cmov;
	FLAC__bool mmx;
	FLAC__bool fxsr;
	FLAC__bool sse;
	FLAC__bool sse2;
99
100
	FLAC__bool sse3;
	FLAC__bool ssse3;
101
102
	FLAC__bool sse41;
	FLAC__bool sse42;
Josh Coalson's avatar
Josh Coalson committed
103
104
105
	FLAC__bool _3dnow;
	FLAC__bool ext3dnow;
	FLAC__bool extmmx;
Josh Coalson's avatar
Josh Coalson committed
106
} FLAC__CPUInfo_IA32;
107
#elif defined FLAC__CPU_X86_64
108
109
110
typedef struct {
	FLAC__bool sse3;
	FLAC__bool ssse3;
111
112
	FLAC__bool sse41;
	FLAC__bool sse42;
113
} FLAC__CPUInfo_x86_64;
114
#elif defined FLAC__CPU_PPC
115
116
typedef struct {
	FLAC__bool altivec;
117
	FLAC__bool ppc64;
118
} FLAC__CPUInfo_PPC;
119
#endif
120

Josh Coalson's avatar
Josh Coalson committed
121
typedef struct {
Josh Coalson's avatar
Josh Coalson committed
122
	FLAC__bool use_asm;
Josh Coalson's avatar
Josh Coalson committed
123
	FLAC__CPUInfo_Type type;
124
125
126
127
128
129
130
#if defined FLAC__CPU_IA32
	FLAC__CPUInfo_IA32 ia32;
#elif defined FLAC__CPU_X86_64
	FLAC__CPUInfo_x86_64 x86_64;
#elif defined FLAC__CPU_PPC
	FLAC__CPUInfo_PPC ppc;
#endif
Josh Coalson's avatar
Josh Coalson committed
131
132
133
134
135
} FLAC__CPUInfo;

void FLAC__cpu_info(FLAC__CPUInfo *info);

#ifndef FLAC__NO_ASM
136

137
#if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM
138
139
140
FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32(void);
void         FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx);
FLAC__uint32 FLAC__cpu_info_extended_amd_asm_ia32(void);
Josh Coalson's avatar
Josh Coalson committed
141
#endif
142

143
#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN
144
FLAC__uint32 FLAC__cpu_have_cpuid_x86(void);
145
146
147
void FLAC__cpu_info_x86(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx);
#endif

Josh Coalson's avatar
Josh Coalson committed
148
149
150
#endif

#endif