typo fixes
[mplayer/greg.git] / libvo / aclib.c
blob5f2c1f64df8c0b0dbf8692ff4d9fab248109cc29
1 #include "config.h"
2 #ifdef USE_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 "cpudetect.h"
12 #include "fastmemcpy.h"
13 #undef memcpy
15 #define BLOCK_SIZE 4096
16 #define CONFUSION_FACTOR 0
17 //Feel free to fine-tune the above 2, it might be possible to get some speedup with them :)
19 //#define STATISTICS
20 #if defined(ARCH_X86) || defined(ARCH_X86_64)
21 #define CAN_COMPILE_X86_ASM
22 #endif
24 //Note: we have MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
25 //Plain C versions
26 //#if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT)
27 //#define COMPILE_C
28 //#endif
30 #ifdef CAN_COMPILE_X86_ASM
32 #if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
33 #define COMPILE_MMX
34 #endif
36 #if (defined (HAVE_MMX2) && !defined (HAVE_SSE2)) || defined (RUNTIME_CPUDETECT)
37 #define COMPILE_MMX2
38 #endif
40 #if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
41 #define COMPILE_3DNOW
42 #endif
44 #if defined (HAVE_SSE2) || defined (RUNTIME_CPUDETECT)
45 #define COMPILE_SSE
46 #endif
48 #undef HAVE_MMX
49 #undef HAVE_MMX2
50 #undef HAVE_3DNOW
51 #undef HAVE_SSE
52 #undef HAVE_SSE2
54 #ifdef COMPILE_C
55 #undef HAVE_MMX
56 #undef HAVE_MMX2
57 #undef HAVE_3DNOW
58 #undef ARCH_X86
59 #define RENAME(a) a ## _C
60 #include "aclib_template.c"
61 #endif
63 //MMX versions
64 #ifdef COMPILE_MMX
65 #undef RENAME
66 #define HAVE_MMX
67 #undef HAVE_MMX2
68 #undef HAVE_3DNOW
69 #undef HAVE_SSE
70 #undef HAVE_SSE2
71 #define RENAME(a) a ## _MMX
72 #include "aclib_template.c"
73 #endif
75 //MMX2 versions
76 #ifdef COMPILE_MMX2
77 #undef RENAME
78 #define HAVE_MMX
79 #define HAVE_MMX2
80 #undef HAVE_3DNOW
81 #undef HAVE_SSE
82 #undef HAVE_SSE2
83 #define RENAME(a) a ## _MMX2
84 #include "aclib_template.c"
85 #endif
87 //3DNOW versions
88 #ifdef COMPILE_3DNOW
89 #undef RENAME
90 #define HAVE_MMX
91 #undef HAVE_MMX2
92 #define HAVE_3DNOW
93 #undef HAVE_SSE
94 #undef HAVE_SSE2
95 #define RENAME(a) a ## _3DNow
96 #include "aclib_template.c"
97 #endif
99 //SSE versions (only used on SSE2 cpus)
100 #ifdef COMPILE_SSE
101 #undef RENAME
102 #define HAVE_MMX
103 #define HAVE_MMX2
104 #undef HAVE_3DNOW
105 #define HAVE_SSE
106 #define HAVE_SSE2
107 #define RENAME(a) a ## _SSE
108 #include "aclib_template.c"
109 #endif
111 #endif // CAN_COMPILE_X86_ASM
114 void * fast_memcpy(void * to, const void * from, size_t len)
116 #ifdef RUNTIME_CPUDETECT
117 #ifdef CAN_COMPILE_X86_ASM
118 // ordered per speed fasterst first
119 if(gCpuCaps.hasSSE2)
120 fast_memcpy_SSE(to, from, len);
121 else if(gCpuCaps.hasMMX2)
122 fast_memcpy_MMX2(to, from, len);
123 else if(gCpuCaps.has3DNow)
124 fast_memcpy_3DNow(to, from, len);
125 else if(gCpuCaps.hasMMX)
126 fast_memcpy_MMX(to, from, len);
127 else
128 #endif //CAN_COMPILE_X86_ASM
129 memcpy(to, from, len); // prior to mmx we use the standart memcpy
130 #else
131 #ifdef HAVE_SSE2
132 fast_memcpy_SSE(to, from, len);
133 #elif defined (HAVE_MMX2)
134 fast_memcpy_MMX2(to, from, len);
135 #elif defined (HAVE_3DNOW)
136 fast_memcpy_3DNow(to, from, len);
137 #elif defined (HAVE_MMX)
138 fast_memcpy_MMX(to, from, len);
139 #else
140 memcpy(to, from, len); // prior to mmx we use the standart memcpy
141 #endif
143 #endif //!RUNTIME_CPUDETECT
144 return to;
147 #undef mem2agpcpy
148 void * mem2agpcpy(void * to, const void * from, size_t len)
150 #ifdef RUNTIME_CPUDETECT
151 #ifdef CAN_COMPILE_X86_ASM
152 // ordered per speed fasterst first
153 if(gCpuCaps.hasSSE2)
154 mem2agpcpy_SSE(to, from, len);
155 else if(gCpuCaps.hasMMX2)
156 mem2agpcpy_MMX2(to, from, len);
157 else if(gCpuCaps.has3DNow)
158 mem2agpcpy_3DNow(to, from, len);
159 else if(gCpuCaps.hasMMX)
160 mem2agpcpy_MMX(to, from, len);
161 else
162 #endif //CAN_COMPILE_X86_ASM
163 memcpy(to, from, len); // prior to mmx we use the standart memcpy
164 #else
165 #ifdef HAVE_SSE2
166 mem2agpcpy_SSE(to, from, len);
167 #elif defined (HAVE_MMX2)
168 mem2agpcpy_MMX2(to, from, len);
169 #elif defined (HAVE_3DNOW)
170 mem2agpcpy_3DNow(to, from, len);
171 #elif defined (HAVE_MMX)
172 mem2agpcpy_MMX(to, from, len);
173 #else
174 memcpy(to, from, len); // prior to mmx we use the standart memcpy
175 #endif
177 #endif //!RUNTIME_CPUDETECT
178 return to;
181 #endif /* use fastmemcpy */