sync with en/mplayer.1 r28991
[mplayer/glamo.git] / libvo / aclib.c
blob47c9dead6b85c014434a4a733631f58bec544b29
1 /*
2 * aclib - advanced C library ;)
3 * Functions which improve and expand the standard C library, see aclib_template.c.
4 * This file only contains runtime CPU detection and config option stuff.
5 * runtime CPU detection by Michael Niedermayer (michaelni@gmx.at)
7 * This file is part of MPlayer.
9 * MPlayer is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * MPlayer is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include "config.h"
25 #include <stddef.h>
26 #include <string.h>
27 #include "cpudetect.h"
28 #include "fastmemcpy.h"
29 #undef memcpy
31 #define BLOCK_SIZE 4096
32 #define CONFUSION_FACTOR 0
33 //Feel free to fine-tune the above 2, it might be possible to get some speedup with them :)
35 //#define STATISTICS
37 //Note: we have MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
38 //Plain C versions
39 //#if !HAVE_MMX || defined (RUNTIME_CPUDETECT)
40 //#define COMPILE_C
41 //#endif
43 #if ARCH_X86
45 #if (HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
46 #define COMPILE_MMX
47 #endif
49 #if (HAVE_MMX2 && !HAVE_SSE2) || defined (RUNTIME_CPUDETECT)
50 #define COMPILE_MMX2
51 #endif
53 #if (HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
54 #define COMPILE_3DNOW
55 #endif
57 #if HAVE_SSE2 || defined (RUNTIME_CPUDETECT)
58 #define COMPILE_SSE
59 #endif
61 #undef HAVE_MMX
62 #undef HAVE_MMX2
63 #undef HAVE_AMD3DNOW
64 #undef HAVE_SSE
65 #undef HAVE_SSE2
66 #define HAVE_MMX 0
67 #define HAVE_MMX2 0
68 #define HAVE_AMD3DNOW 0
69 #define HAVE_SSE 0
70 #define HAVE_SSE2 0
72 #ifdef COMPILE_C
73 #undef HAVE_MMX
74 #undef HAVE_MMX2
75 #undef HAVE_AMD3DNOW
76 #undef HAVE_SSE
77 #undef HAVE_SSE2
78 #define HAVE_MMX 0
79 #define HAVE_MMX2 0
80 #define HAVE_AMD3DNOW 0
81 #define HAVE_SSE 0
82 #define HAVE_SSE2 0
83 #define RENAME(a) a ## _C
84 #include "aclib_template.c"
85 #endif
87 //MMX versions
88 #ifdef COMPILE_MMX
89 #undef RENAME
90 #undef HAVE_MMX
91 #undef HAVE_MMX2
92 #undef HAVE_AMD3DNOW
93 #undef HAVE_SSE
94 #undef HAVE_SSE2
95 #define HAVE_MMX 1
96 #define HAVE_MMX2 0
97 #define HAVE_AMD3DNOW 0
98 #define HAVE_SSE 0
99 #define HAVE_SSE2 0
100 #define RENAME(a) a ## _MMX
101 #include "aclib_template.c"
102 #endif
104 //MMX2 versions
105 #ifdef COMPILE_MMX2
106 #undef RENAME
107 #undef HAVE_MMX
108 #undef HAVE_MMX2
109 #undef HAVE_AMD3DNOW
110 #undef HAVE_SSE
111 #undef HAVE_SSE2
112 #define HAVE_MMX 1
113 #define HAVE_MMX2 1
114 #define HAVE_AMD3DNOW 0
115 #define HAVE_SSE 0
116 #define HAVE_SSE2 0
117 #define RENAME(a) a ## _MMX2
118 #include "aclib_template.c"
119 #endif
121 //3DNOW versions
122 #ifdef COMPILE_3DNOW
123 #undef RENAME
124 #undef HAVE_MMX
125 #undef HAVE_MMX2
126 #undef HAVE_AMD3DNOW
127 #undef HAVE_SSE
128 #undef HAVE_SSE2
129 #define HAVE_MMX 1
130 #define HAVE_MMX2 0
131 #define HAVE_AMD3DNOW 1
132 #define HAVE_SSE 0
133 #define HAVE_SSE2 0
134 #define RENAME(a) a ## _3DNow
135 #include "aclib_template.c"
136 #endif
138 //SSE versions (only used on SSE2 cpus)
139 #ifdef COMPILE_SSE
140 #undef RENAME
141 #undef HAVE_MMX
142 #undef HAVE_MMX2
143 #undef HAVE_AMD3DNOW
144 #undef HAVE_SSE
145 #undef HAVE_SSE2
146 #define HAVE_MMX 1
147 #define HAVE_MMX2 1
148 #define HAVE_AMD3DNOW 0
149 #define HAVE_SSE 1
150 #define HAVE_SSE2 1
151 #define RENAME(a) a ## _SSE
152 #include "aclib_template.c"
153 #endif
155 #endif /* ARCH_X86 */
158 #undef fast_memcpy
159 void * fast_memcpy(void * to, const void * from, size_t len)
161 #ifdef RUNTIME_CPUDETECT
162 #if ARCH_X86
163 // ordered per speed fasterst first
164 if(gCpuCaps.hasSSE2)
165 fast_memcpy_SSE(to, from, len);
166 else if(gCpuCaps.hasMMX2)
167 fast_memcpy_MMX2(to, from, len);
168 else if(gCpuCaps.has3DNow)
169 fast_memcpy_3DNow(to, from, len);
170 else if(gCpuCaps.hasMMX)
171 fast_memcpy_MMX(to, from, len);
172 else
173 #endif
174 memcpy(to, from, len); // prior to mmx we use the standart memcpy
175 #else
176 #if HAVE_SSE2
177 fast_memcpy_SSE(to, from, len);
178 #elif HAVE_MMX2
179 fast_memcpy_MMX2(to, from, len);
180 #elif HAVE_AMD3DNOW
181 fast_memcpy_3DNow(to, from, len);
182 #elif HAVE_MMX
183 fast_memcpy_MMX(to, from, len);
184 #else
185 memcpy(to, from, len); // prior to mmx we use the standart memcpy
186 #endif
188 #endif //!RUNTIME_CPUDETECT
189 return to;
192 #undef mem2agpcpy
193 void * mem2agpcpy(void * to, const void * from, size_t len)
195 #ifdef RUNTIME_CPUDETECT
196 #if ARCH_X86
197 // ordered per speed fasterst first
198 if(gCpuCaps.hasSSE2)
199 mem2agpcpy_SSE(to, from, len);
200 else if(gCpuCaps.hasMMX2)
201 mem2agpcpy_MMX2(to, from, len);
202 else if(gCpuCaps.has3DNow)
203 mem2agpcpy_3DNow(to, from, len);
204 else if(gCpuCaps.hasMMX)
205 mem2agpcpy_MMX(to, from, len);
206 else
207 #endif
208 memcpy(to, from, len); // prior to mmx we use the standart memcpy
209 #else
210 #if HAVE_SSE2
211 mem2agpcpy_SSE(to, from, len);
212 #elif HAVE_MMX2
213 mem2agpcpy_MMX2(to, from, len);
214 #elif HAVE_AMD3DNOW
215 mem2agpcpy_3DNow(to, from, len);
216 #elif HAVE_MMX
217 mem2agpcpy_MMX(to, from, len);
218 #else
219 memcpy(to, from, len); // prior to mmx we use the standart memcpy
220 #endif
222 #endif //!RUNTIME_CPUDETECT
223 return to;