18722Sjkh/* { dg-do run } */ 220315Sjkh/* { dg-options "-std=gnu99 -msse2 -mpreferred-stack-boundary=4" } */ 38722Sjkh/* { dg-require-effective-target sse2 } */ 420315Sjkh 520315Sjkh#include "sse2-check.h" 68722Sjkh 742005Sjkh#include <emmintrin.h> 820315Sjkh 920315Sjkh#ifdef __x86_64__ 1020315Sjkh# define PUSH "pushq %rsi" 1120315Sjkh# define POP "popq %rsi" 1220315Sjkh#else 1320315Sjkh# define PUSH "pushl %esi" 1420315Sjkh# define POP "popl %esi" 1520315Sjkh#endif 1620315Sjkh 1720315Sjkh__m128i __attribute__ ((__noinline__)) 1820315Sjkhvector_using_function () 1920315Sjkh{ 2020315Sjkh volatile __m128i vx; /* We want to force a vector-aligned store into the stack. */ 2120315Sjkh vx = _mm_xor_si128 (vx, vx); 2220315Sjkh return vx; 2320315Sjkh} 2420315Sjkhint __attribute__ ((__noinline__, __force_align_arg_pointer__)) 2520315Sjkhself_aligning_function (int x, int y) 2620315Sjkh{ 2720315Sjkh __m128i ignored = vector_using_function (); 2820315Sjkh return (x + y); 2920315Sjkh} 3020315Sjkhint g_1 = 20; 3120315Sjkhint g_2 = 22; 3220315Sjkh 3320315Sjkhstatic void 3420315Sjkhsse2_test (void) 358722Sjkh{ 368722Sjkh int result; 3720315Sjkh asm (PUSH); /* Misalign runtime stack. */ 388726Sgpalmer result = self_aligning_function (g_1, g_2); 398726Sgpalmer if (result != 42) 408726Sgpalmer abort (); 4120315Sjkh asm (POP); 4220315Sjkh} 4320315Sjkh