mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	This patch fixes mixed SSE/AVX audit and checks AVX only once in _dl_runtime_profile. When an AVX or SSE register value in pltenter is modified, we have to make sure that the SSE part value is the same in both lr_xmm and lr_vector fields so that pltexit will get the correct value from either lr_xmm or lr_vector fields. AVX-enabled pltenter should update both lr_xmm and lr_vector fields to support stacked AVX/SSE pltenter functions.
		
			
				
	
	
		
			29 lines
		
	
	
		
			671 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
		
			671 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* 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);
 | 
						|
 | 
						|
int
 | 
						|
main (void)
 | 
						|
{
 | 
						|
  unsigned int eax, ebx, ecx, edx;
 | 
						|
 | 
						|
  /* Run AVX test only if AVX is supported.  */
 | 
						|
  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
 | 
						|
      && (ecx & bit_AVX))
 | 
						|
    {
 | 
						|
      __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;
 | 
						|
}
 |