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.
27 #include "cpudetect.h"
28 #include "fastmemcpy.h"
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 :)
37 #define CAN_COMPILE_X86_ASM
40 //Note: we have MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
42 //#if !HAVE_MMX || defined (RUNTIME_CPUDETECT)
46 #ifdef CAN_COMPILE_X86_ASM
48 #if (HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
52 #if (HAVE_MMX2 && !HAVE_SSE2) || defined (RUNTIME_CPUDETECT)
56 #if (HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
60 #if HAVE_SSE2 || defined (RUNTIME_CPUDETECT)
71 #define HAVE_AMD3DNOW 0
83 #define HAVE_AMD3DNOW 0
86 #define RENAME(a) a ## _C
87 #include "aclib_template.c"
100 #define HAVE_AMD3DNOW 0
103 #define RENAME(a) a ## _MMX
104 #include "aclib_template.c"
117 #define HAVE_AMD3DNOW 0
120 #define RENAME(a) a ## _MMX2
121 #include "aclib_template.c"
134 #define HAVE_AMD3DNOW 1
137 #define RENAME(a) a ## _3DNow
138 #include "aclib_template.c"
141 //SSE versions (only used on SSE2 cpus)
151 #define HAVE_AMD3DNOW 0
154 #define RENAME(a) a ## _SSE
155 #include "aclib_template.c"
158 #endif // CAN_COMPILE_X86_ASM
162 void * fast_memcpy(void * to
, const void * from
, size_t len
)
164 #ifdef RUNTIME_CPUDETECT
165 #ifdef CAN_COMPILE_X86_ASM
166 // ordered per speed fasterst first
168 fast_memcpy_SSE(to
, from
, len
);
169 else if(gCpuCaps
.hasMMX2
)
170 fast_memcpy_MMX2(to
, from
, len
);
171 else if(gCpuCaps
.has3DNow
)
172 fast_memcpy_3DNow(to
, from
, len
);
173 else if(gCpuCaps
.hasMMX
)
174 fast_memcpy_MMX(to
, from
, len
);
176 #endif //CAN_COMPILE_X86_ASM
177 memcpy(to
, from
, len
); // prior to mmx we use the standart memcpy
180 fast_memcpy_SSE(to
, from
, len
);
182 fast_memcpy_MMX2(to
, from
, len
);
184 fast_memcpy_3DNow(to
, from
, len
);
186 fast_memcpy_MMX(to
, from
, len
);
188 memcpy(to
, from
, len
); // prior to mmx we use the standart memcpy
191 #endif //!RUNTIME_CPUDETECT
196 void * mem2agpcpy(void * to
, const void * from
, size_t len
)
198 #ifdef RUNTIME_CPUDETECT
199 #ifdef CAN_COMPILE_X86_ASM
200 // ordered per speed fasterst first
202 mem2agpcpy_SSE(to
, from
, len
);
203 else if(gCpuCaps
.hasMMX2
)
204 mem2agpcpy_MMX2(to
, from
, len
);
205 else if(gCpuCaps
.has3DNow
)
206 mem2agpcpy_3DNow(to
, from
, len
);
207 else if(gCpuCaps
.hasMMX
)
208 mem2agpcpy_MMX(to
, from
, len
);
210 #endif //CAN_COMPILE_X86_ASM
211 memcpy(to
, from
, len
); // prior to mmx we use the standart memcpy
214 mem2agpcpy_SSE(to
, from
, len
);
216 mem2agpcpy_MMX2(to
, from
, len
);
218 mem2agpcpy_3DNow(to
, from
, len
);
220 mem2agpcpy_MMX(to
, from
, len
);
222 memcpy(to
, from
, len
); // prior to mmx we use the standart memcpy
225 #endif //!RUNTIME_CPUDETECT