| 
									
										
										
										
											2009-08-08 17:54:42 +00:00
										 |  |  | /* Test case for x86-64 preserved registers in dynamic linker.  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <cpuid.h>
 | 
					
						
							|  |  |  | #include <emmintrin.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i, | 
					
						
							|  |  |  | 			   __m128i, __m128i, __m128i, __m128i); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-21 01:21:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | avx_enabled (void) | 
					
						
							| 
									
										
										
										
											2009-08-08 17:54:42 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   unsigned int eax, ebx, ecx, edx; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-21 01:21:03 +00:00
										 |  |  |   if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0 | 
					
						
							|  |  |  |       || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE)) | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Check the OS has AVX and SSE saving enabled.  */ | 
					
						
							|  |  |  |   asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return (eax & 6) == 6; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | main (void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-08 17:54:42 +00:00
										 |  |  |   /* Run AVX test only if AVX is supported.  */ | 
					
						
							| 
									
										
										
										
											2011-07-21 01:21:03 +00:00
										 |  |  |   if (avx_enabled ()) | 
					
						
							| 
									
										
										
										
											2009-08-08 17:54:42 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       __m128i xmm = _mm_setzero_si128 (); | 
					
						
							|  |  |  |       __m128i ret = audit_test (xmm, xmm, xmm, xmm, xmm, xmm, xmm, xmm); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       xmm = _mm_set1_epi32 (0x98abcdef); | 
					
						
							|  |  |  |       if (memcmp (&xmm, &ret, sizeof (ret))) | 
					
						
							|  |  |  | 	abort (); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } |