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
11 #include "cpudetect.h"
12 #include "fastmemcpy.h"
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 :)
20 #if defined(ARCH_X86) || defined(ARCH_X86_64)
21 #define CAN_COMPILE_X86_ASM
24 //Note: we have MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
26 //#if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT)
30 #ifdef CAN_COMPILE_X86_ASM
32 #if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
36 #if (defined (HAVE_MMX2) && !defined (HAVE_SSE2)) || defined (RUNTIME_CPUDETECT)
40 #if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
44 #if defined (HAVE_SSE2) || defined (RUNTIME_CPUDETECT)
59 #define RENAME(a) a ## _C
60 #include "aclib_template.c"
71 #define RENAME(a) a ## _MMX
72 #include "aclib_template.c"
83 #define RENAME(a) a ## _MMX2
84 #include "aclib_template.c"
95 #define RENAME(a) a ## _3DNow
96 #include "aclib_template.c"
99 //SSE versions (only used on SSE2 cpus)
107 #define RENAME(a) a ## _SSE
108 #include "aclib_template.c"
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
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
);
128 #endif //CAN_COMPILE_X86_ASM
129 memcpy(to
, from
, len
); // prior to mmx we use the standart memcpy
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
);
140 memcpy(to
, from
, len
); // prior to mmx we use the standart memcpy
143 #endif //!RUNTIME_CPUDETECT
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
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
);
162 #endif //CAN_COMPILE_X86_ASM
163 memcpy(to
, from
, len
); // prior to mmx we use the standart memcpy
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
);
174 memcpy(to
, from
, len
); // prior to mmx we use the standart memcpy
177 #endif //!RUNTIME_CPUDETECT
181 #endif /* use fastmemcpy */