1 #include "evas_common.h"
2 #if defined BUILD_MMX || defined BUILD_SSE
10 #if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP)
15 static sigjmp_buf detect_buf;
18 static int cpu_feature_mask = 0;
20 #if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP)
21 static void evas_common_cpu_catch_ill(int sig);
22 static void evas_common_cpu_catch_segv(int sig);
25 evas_common_cpu_catch_ill(int sig __UNUSED__)
27 siglongjmp(detect_buf, 1);
31 evas_common_cpu_catch_segv(int sig __UNUSED__)
33 siglongjmp(detect_buf, 1);
38 evas_common_cpu_mmx_test(void)
46 evas_common_cpu_mmx2_test(void)
52 mmx_r2m(movntq, mm0, data);
58 evas_common_cpu_sse_test(void)
63 movntq_r2m(mm0, blah);
67 void evas_common_op_sse3_test(void);
70 evas_common_cpu_sse3_test(void)
73 evas_common_op_sse3_test();
78 evas_common_cpu_altivec_test(void)
82 vector unsigned int zero;
84 zero = vec_splat_u32(0);
86 #endif /* __POWERPC__ */
90 evas_common_cpu_neon_test(void)
92 //#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70)
96 "vqadd.u8 d0, d1, d0\n"
107 evas_common_cpu_vis_test(void)
110 #endif /* __SPARC__ */
114 evas_common_cpu_feature_test(void (*feature)(void))
116 #if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP)
118 struct sigaction act, oact, oact2;
120 act.sa_handler = evas_common_cpu_catch_ill;
121 act.sa_flags = SA_RESTART;
122 sigemptyset(&act.sa_mask);
123 sigaction(SIGILL, &act, &oact);
125 act.sa_handler = evas_common_cpu_catch_segv;
126 act.sa_flags = SA_RESTART;
127 sigemptyset(&act.sa_mask);
128 sigaction(SIGSEGV, &act, &oact2);
130 if (sigsetjmp(detect_buf, 1))
132 sigaction(SIGILL, &oact, NULL);
133 sigaction(SIGSEGV, &oact2, NULL);
139 sigaction(SIGILL, &oact, NULL);
140 sigaction(SIGSEGV, &oact2, NULL);
148 evas_common_cpu_init(void)
150 static int called = 0;
155 cpu_feature_mask |= CPU_FEATURE_MMX *
156 evas_common_cpu_feature_test(evas_common_cpu_mmx_test);
157 evas_common_cpu_end_opt();
158 if (getenv("EVAS_CPU_NO_MMX"))
159 cpu_feature_mask &= ~CPU_FEATURE_MMX;
160 cpu_feature_mask |= CPU_FEATURE_MMX2 *
161 evas_common_cpu_feature_test(evas_common_cpu_mmx2_test);
162 evas_common_cpu_end_opt();
163 if (getenv("EVAS_CPU_NO_MMX2"))
164 cpu_feature_mask &= ~CPU_FEATURE_MMX2;
166 cpu_feature_mask |= CPU_FEATURE_SSE *
167 evas_common_cpu_feature_test(evas_common_cpu_sse_test);
168 evas_common_cpu_end_opt();
169 if (getenv("EVAS_CPU_NO_SSE"))
170 cpu_feature_mask &= ~CPU_FEATURE_SSE;
172 cpu_feature_mask |= CPU_FEATURE_SSE3 *
173 evas_common_cpu_feature_test(evas_common_cpu_sse3_test);
174 evas_common_cpu_end_opt();
175 if (getenv("EVAS_CPU_NO_SSE3"))
176 cpu_feature_mask &= ~CPU_FEATURE_SSE3;
177 #endif /* BUILD_SSE3 */
178 #endif /* BUILD_SSE */
179 #endif /* BUILD_MMX */
182 cpu_feature_mask |= CPU_FEATURE_ALTIVEC *
183 evas_common_cpu_feature_test(evas_common_cpu_altivec_test);
184 evas_common_cpu_end_opt();
185 if (getenv("EVAS_CPU_NO_ALTIVEC"))
186 cpu_feature_mask &= ~CPU_FEATURE_ALTIVEC;
188 #endif /* __POWERPC__ */
190 cpu_feature_mask |= CPU_FEATURE_VIS *
191 evas_common_cpu_feature_test(evas_common_cpu_vis_test);
192 evas_common_cpu_end_opt();
193 if (getenv("EVAS_CPU_NO_VIS"))
194 cpu_feature_mask &= ~CPU_FEATURE_VIS;
195 #endif /* __SPARC__ */
196 #if defined(__ARM_ARCH__)
198 cpu_feature_mask |= CPU_FEATURE_NEON *
199 evas_common_cpu_feature_test(evas_common_cpu_neon_test);
200 evas_common_cpu_end_opt();
201 if (getenv("EVAS_CPU_NO_NEON"))
202 cpu_feature_mask &= ~CPU_FEATURE_NEON;
208 evas_common_cpu_has_feature(unsigned int feature)
210 return (cpu_feature_mask & feature);
214 evas_common_cpu_have_cpuid(void)
219 unsigned int have_cpu_id;
222 have_cpuid(have_cpu_id);
231 evas_common_cpu_can_do(int *mmx, int *sse, int *sse2)
233 static int do_mmx = 0, do_sse = 0, do_sse2 = 0, done = 0;
237 # ifdef HARD_CODED_P3
238 cpu_feature_mask |= CPU_FEATURE_MMX;
239 cpu_feature_mask |= CPU_FEATURE_SSE;
242 cpu_feature_mask |= CPU_FEATURE_MMX;
244 if (cpu_feature_mask & CPU_FEATURE_MMX) do_mmx = 1;
245 if (cpu_feature_mask & CPU_FEATURE_MMX2) do_sse = 1;
246 if (cpu_feature_mask & CPU_FEATURE_SSE) do_sse = 1;
248 // INF("%i %i %i", do_mmx, do_sse, do_sse2);
257 evas_common_cpu_end_opt(void)
259 if (cpu_feature_mask &
260 (CPU_FEATURE_MMX | CPU_FEATURE_MMX2))
267 evas_common_cpu_end_opt(void)