1  /* PR middle-end/37009 */
       2  /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
       3  /* { dg-additional-options "-mmmx -msse2" } */
       4  /* { dg-require-effective-target sse2_runtime } */
       5  
       6  #include <stdarg.h>
       7  #include <emmintrin.h>
       8  #include "check.h"
       9  
      10  #ifndef ALIGNMENT
      11  #define ALIGNMENT	16
      12  #endif
      13  
      14  typedef int aligned __attribute__((aligned(ALIGNMENT)));
      15  
      16  void
      17  bar (char *p, int size)
      18  {
      19    __builtin_strncpy (p, "good", size);
      20  }
      21  
      22  __m128 a = { 1.0 };
      23  
      24  void
      25  test (va_list arg)
      26  {
      27    char *p;
      28    aligned i;
      29    int size;
      30    double x;
      31    __m128 e;
      32  
      33    size = va_arg (arg, int);
      34    if (size != 5)
      35      abort ();
      36  
      37    p = __builtin_alloca (size + 1);
      38  
      39    x = va_arg (arg, double);
      40    if (x != 5.0)
      41      abort ();
      42  
      43    bar (p, size);
      44    if (__builtin_strncmp (p, "good", size) != 0)
      45      {
      46  #ifdef DEBUG
      47        p[size] = '\0';
      48        printf ("Failed: %s != good\n", p);
      49  #endif
      50        abort ();
      51      }
      52  
      53    if (check_int (&i,  __alignof__(i)) != i)
      54      abort ();
      55  
      56    e = va_arg (arg, __m128);
      57    if (__builtin_memcmp (&e, &a, sizeof (e)))
      58      abort ();
      59  }
      60  
      61  void
      62  foo (const char *fmt, ...)
      63  {
      64    va_list arg;
      65    va_start (arg, fmt);
      66    test (arg);
      67    va_end (arg);
      68  }
      69  
      70  int
      71  main (void)
      72  {
      73    __m128 x = { 1.0 };
      74  
      75    foo ("foo", 5, 5.0, x);
      76  
      77    return 0;
      78  }