More #ifdef HAVE_MMX etc. missed by earlier search.
[mplayer/glamo.git] / libvo / aclib.c
blob024cf06a6b635d8d1b5eef67ff148eae12ecf0bc
1 #include "config.h"
2 #ifdef CONFIG_FASTMEMCPY
4 /*
5 aclib - advanced C library ;)
6 This file contains functions which improve and expand standard C-library
7 see aclib_template.c ... this file only contains runtime cpu detection and config options stuff
8 runtime cpu detection by michael niedermayer (michaelni@gmx.at) is under GPL
9 */
10 #include <stddef.h>
11 #include <string.h>
12 #include "cpudetect.h"
13 #include "fastmemcpy.h"
14 #undef memcpy
16 #define BLOCK_SIZE 4096
17 #define CONFUSION_FACTOR 0
18 //Feel free to fine-tune the above 2, it might be possible to get some speedup with them :)
20 //#define STATISTICS
21 #if ARCH_X86
22 #define CAN_COMPILE_X86_ASM
23 #endif
25 //Note: we have MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
26 //Plain C versions
27 //#if !HAVE_MMX || defined (RUNTIME_CPUDETECT)
28 //#define COMPILE_C
29 //#endif
31 #ifdef CAN_COMPILE_X86_ASM
33 #if (HAVE_MMX && !HAVE_3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
34 #define COMPILE_MMX
35 #endif
37 #if (HAVE_MMX2 && !HAVE_SSE2) || defined (RUNTIME_CPUDETECT)
38 #define COMPILE_MMX2
39 #endif
41 #if (HAVE_3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
42 #define COMPILE_3DNOW
43 #endif
45 #if HAVE_SSE2 || defined (RUNTIME_CPUDETECT)
46 #define COMPILE_SSE
47 #endif
49 #undef HAVE_MMX
50 #undef HAVE_MMX2
51 #undef HAVE_3DNOW
52 #undef HAVE_SSE
53 #undef HAVE_SSE2
54 #define HAVE_MMX 0
55 #define HAVE_MMX2 0
56 #define HAVE_3DNOW 0
57 #define HAVE_SSE 0
58 #define HAVE_SSE2 0
60 #ifdef COMPILE_C
61 #undef HAVE_MMX
62 #undef HAVE_MMX2
63 #undef HAVE_3DNOW
64 #undef HAVE_SSE
65 #undef HAVE_SSE2
66 #define HAVE_MMX 0
67 #define HAVE_MMX2 0
68 #define HAVE_3DNOW 0
69 #define HAVE_SSE 0
70 #define HAVE_SSE2 0
71 #define RENAME(a) a ## _C
72 #include "aclib_template.c"
73 #endif
75 //MMX versions
76 #ifdef COMPILE_MMX
77 #undef RENAME
78 #undef HAVE_MMX
79 #undef HAVE_MMX2
80 #undef HAVE_3DNOW
81 #undef HAVE_SSE
82 #undef HAVE_SSE2
83 #define HAVE_MMX 1
84 #define HAVE_MMX2 0
85 #define HAVE_3DNOW 0
86 #define HAVE_SSE 0
87 #define HAVE_SSE2 0
88 #define RENAME(a) a ## _MMX
89 #include "aclib_template.c"
90 #endif
92 //MMX2 versions
93 #ifdef COMPILE_MMX2
94 #undef RENAME
95 #undef HAVE_MMX
96 #undef HAVE_MMX2
97 #undef HAVE_3DNOW
98 #undef HAVE_SSE
99 #undef HAVE_SSE2
100 #define HAVE_MMX 1
101 #define HAVE_MMX2 1
102 #define HAVE_3DNOW 0
103 #define HAVE_SSE 0
104 #define HAVE_SSE2 0
105 #define HAVE_MMX
106 #define HAVE_MMX2
107 #define RENAME(a) a ## _MMX2
108 #include "aclib_template.c"
109 #endif
111 //3DNOW versions
112 #ifdef COMPILE_3DNOW
113 #undef RENAME
114 #undef HAVE_MMX
115 #undef HAVE_MMX2
116 #undef HAVE_3DNOW
117 #undef HAVE_SSE
118 #undef HAVE_SSE2
119 #define HAVE_MMX 1
120 #define HAVE_MMX2 0
121 #define HAVE_3DNOW 1
122 #define HAVE_SSE 0
123 #define HAVE_SSE2 0
124 #define RENAME(a) a ## _3DNow
125 #include "aclib_template.c"
126 #endif
128 //SSE versions (only used on SSE2 cpus)
129 #ifdef COMPILE_SSE
130 #undef RENAME
131 #undef HAVE_MMX
132 #undef HAVE_MMX2
133 #undef HAVE_3DNOW
134 #undef HAVE_SSE
135 #undef HAVE_SSE2
136 #define HAVE_MMX 1
137 #define HAVE_MMX2 1
138 #define HAVE_3DNOW 0
139 #define HAVE_SSE 1
140 #define HAVE_SSE2 1
141 #define RENAME(a) a ## _SSE
142 #include "aclib_template.c"
143 #endif
145 #endif // CAN_COMPILE_X86_ASM
148 #undef fast_memcpy
149 void * fast_memcpy(void * to, const void * from, size_t len)
151 #ifdef RUNTIME_CPUDETECT
152 #ifdef CAN_COMPILE_X86_ASM
153 // ordered per speed fasterst first
154 if(gCpuCaps.hasSSE2)
155 fast_memcpy_SSE(to, from, len);
156 else if(gCpuCaps.hasMMX2)
157 fast_memcpy_MMX2(to, from, len);
158 else if(gCpuCaps.has3DNow)
159 fast_memcpy_3DNow(to, from, len);
160 else if(gCpuCaps.hasMMX)
161 fast_memcpy_MMX(to, from, len);
162 else
163 #endif //CAN_COMPILE_X86_ASM
164 memcpy(to, from, len); // prior to mmx we use the standart memcpy
165 #else
166 #if HAVE_SSE2
167 fast_memcpy_SSE(to, from, len);
168 #elif HAVE_MMX2
169 fast_memcpy_MMX2(to, from, len);
170 #elif HAVE_3DNOW
171 fast_memcpy_3DNow(to, from, len);
172 #elif HAVE_MMX
173 fast_memcpy_MMX(to, from, len);
174 #else
175 memcpy(to, from, len); // prior to mmx we use the standart memcpy
176 #endif
178 #endif //!RUNTIME_CPUDETECT
179 return to;
182 #undef mem2agpcpy
183 void * mem2agpcpy(void * to, const void * from, size_t len)
185 #ifdef RUNTIME_CPUDETECT
186 #ifdef CAN_COMPILE_X86_ASM
187 // ordered per speed fasterst first
188 if(gCpuCaps.hasSSE2)
189 mem2agpcpy_SSE(to, from, len);
190 else if(gCpuCaps.hasMMX2)
191 mem2agpcpy_MMX2(to, from, len);
192 else if(gCpuCaps.has3DNow)
193 mem2agpcpy_3DNow(to, from, len);
194 else if(gCpuCaps.hasMMX)
195 mem2agpcpy_MMX(to, from, len);
196 else
197 #endif //CAN_COMPILE_X86_ASM
198 memcpy(to, from, len); // prior to mmx we use the standart memcpy
199 #else
200 #if HAVE_SSE2
201 mem2agpcpy_SSE(to, from, len);
202 #elif HAVE_MMX2
203 mem2agpcpy_MMX2(to, from, len);
204 #elif HAVE_3DNOW
205 mem2agpcpy_3DNow(to, from, len);
206 #elif HAVE_MMX
207 mem2agpcpy_MMX(to, from, len);
208 #else
209 memcpy(to, from, len); // prior to mmx we use the standart memcpy
210 #endif
212 #endif //!RUNTIME_CPUDETECT
213 return to;
216 #endif /* CONFIG_FASTMEMCPY */