2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
5 #include "evas_common.h"
7 #if defined BUILD_MMX || defined BUILD_SSE
14 static sigjmp_buf detect_buf;
17 static int cpu_feature_mask = 0;
20 static void evas_common_cpu_catch_ill(int sig);
21 static void evas_common_cpu_catch_segv(int sig);
24 evas_common_cpu_catch_ill(int sig)
26 siglongjmp(detect_buf, 1);
30 evas_common_cpu_catch_segv(int sig)
32 siglongjmp(detect_buf, 1);
37 evas_common_cpu_mmx_test(void)
45 evas_common_cpu_mmx2_test(void)
51 mmx_r2m(movntq, mm0, data);
57 evas_common_cpu_sse_test(void)
62 movntq_r2m(mm0, blah);
67 evas_common_cpu_altivec_test(void)
71 vector unsigned int zero;
73 zero = vec_splat_u32(0);
75 #endif /* __POWERPC__ */
79 evas_common_cpu_vis_test(void)
82 #endif /* __SPARC__ */
86 evas_common_cpu_feature_test(void (*feature)(void))
90 struct sigaction act, oact, oact2;
92 act.sa_handler = evas_common_cpu_catch_ill;
93 act.sa_flags = SA_RESTART;
94 sigemptyset(&act.sa_mask);
95 sigaction(SIGILL, &act, &oact);
97 act.sa_handler = evas_common_cpu_catch_segv;
98 act.sa_flags = SA_RESTART;
99 sigemptyset(&act.sa_mask);
100 sigaction(SIGSEGV, &act, &oact2);
102 if (sigsetjmp(detect_buf, 1))
104 sigaction(SIGILL, &oact, NULL);
105 sigaction(SIGSEGV, &oact2, NULL);
111 sigaction(SIGILL, &oact, NULL);
112 sigaction(SIGSEGV, &oact2, NULL);
120 evas_common_cpu_init(void)
122 static int called = 0;
127 cpu_feature_mask |= CPU_FEATURE_MMX *
128 evas_common_cpu_feature_test(evas_common_cpu_mmx_test);
129 evas_common_cpu_end_opt();
130 cpu_feature_mask |= CPU_FEATURE_MMX2 *
131 evas_common_cpu_feature_test(evas_common_cpu_mmx2_test);
132 evas_common_cpu_end_opt();
134 cpu_feature_mask |= CPU_FEATURE_SSE *
135 evas_common_cpu_feature_test(evas_common_cpu_sse_test);
136 evas_common_cpu_end_opt();
137 #endif /* BUILD_SSE */
138 #endif /* BUILD_MMX */
141 cpu_feature_mask |= CPU_FEATURE_ALTIVEC *
142 evas_common_cpu_feature_test(evas_common_cpu_altivec_test);
143 evas_common_cpu_end_opt();
145 #endif /* __POWERPC__ */
147 cpu_feature_mask |= CPU_FEATURE_VIS *
148 evas_common_cpu_feature_test(evas_common_cpu_vis_test);
149 evas_common_cpu_end_opt();
150 #endif /* __SPARC__ */
154 evas_common_cpu_has_feature(unsigned int feature)
156 return (cpu_feature_mask & feature);
160 evas_common_cpu_have_cpuid(void)
165 unsigned int have_cpu_id;
168 have_cpuid(have_cpu_id);
177 evas_common_cpu_can_do(int *mmx, int *sse, int *sse2)
179 static int do_mmx = 0, do_sse = 0, do_sse2 = 0, done = 0;
183 # ifdef HARD_CODED_P3
184 cpu_feature_mask |= CPU_FEATURE_MMX;
185 cpu_feature_mask |= CPU_FEATURE_SSE;
188 cpu_feature_mask |= CPU_FEATURE_MMX;
190 if (cpu_feature_mask & CPU_FEATURE_MMX) do_mmx = 1;
191 if (cpu_feature_mask & CPU_FEATURE_MMX2) do_sse = 1;
192 if (cpu_feature_mask & CPU_FEATURE_SSE) do_sse = 1;
194 // printf("%i %i %i\n", do_mmx, do_sse, do_sse2);
203 evas_common_cpu_end_opt(void)
205 if (cpu_feature_mask &
206 (CPU_FEATURE_MMX | CPU_FEATURE_MMX2))
213 evas_common_cpu_end_opt(void)
219 evas_common_cpu_count(void)
226 if (cpus != 0) return cpus;
228 sched_getaffinity(getpid(), sizeof(cpu), &cpu);
229 for (i = 0; i < TH_MAX; i++)
231 if (CPU_ISSET(i, &cpu)) cpus = i + 1;