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