1 /* Check if system supports SIMD */
4 #if defined(__i386__) || defined(__x86_64__)
8 extern void abort (void);
9 extern void exit (int);
12 sig_ill_handler (int sig
)
17 static void __attribute__((noinline
))
20 signal(SIGILL
, sig_ill_handler
);
21 #if defined(__PAIRED__)
22 /* 750CL paired-single instruction, 'ps_mul %v0,%v0,%v0'. */
23 asm volatile (".long 0x10000032");
24 #elif defined(__ppc__) || defined(__ppc64__) || defined(__powerpc__) || defined(powerpc)
25 /* Altivec instruction, 'vor %v0,%v0,%v0'. */
26 asm volatile (".long 0x10000484");
27 #elif defined(__i386__) || defined(__x86_64__)
29 int a
, b
, c
, d
, want_level
, want_c
, want_d
;
31 /* Determine what instruction set we've been compiled for, and detect
32 that we're running with it. This allows us to at least do a compile
33 check for, e.g. SSE4.1 when the machine only supports SSE2. */
35 want_level
= 0x80000001, want_c
= bit_XOP
, want_d
= 0;
36 # elif defined(__AVX__)
37 want_level
= 1, want_c
= bit_AVX
, want_d
= 0;
38 # elif defined(__SSE4_1__)
39 want_level
= 1, want_c
= bit_SSE4_1
, want_d
= 0;
40 # elif defined(__SSSE3__)
41 want_level
= 1, want_c
= bit_SSSE3
, want_d
= 0;
43 want_level
= 1, want_c
= 0, want_d
= bit_SSE2
;
44 # if defined(__sun__) && defined(__svr4__)
45 /* Before Solaris 9 4/04, trying to execute an SSE2 instruction gives
46 SIGILL even if the CPU can handle them. */
47 asm volatile ("unpcklpd %xmm0,%xmm2");
51 if (!__get_cpuid (want_level
, &a
, &b
, &c
, &d
)
52 || ((c
& want_c
) | (d
& want_d
)) == 0)
55 #elif defined(__sparc__)
56 asm volatile (".word\t0x81b007c0");
57 #elif defined(__arm__)
59 /* On some processors without NEON support, this instruction may
60 be a no-op, on others it may trap, so check that it executes
62 long long a
= 0, b
= 1;
63 asm ("vorr %P0, %P1, %P2"
70 signal (SIGILL
, SIG_DFL
);