155714Skris/* { dg-do run } */
255714Skris/* { dg-require-effective-target sse4 } */
355714Skris/* { dg-options "-O2 -msse4.1" } */
455714Skris
555714Skris#include "sse4_1-check.h"
655714Skris
755714Skris#ifdef DEBUG
8280297Sjkim#include <stdio.h>
955714Skris#endif
1055714Skris
1155714Skris#include <emmintrin.h>
1255714Skris
1355714Skrisstatic void
1455714Skris__attribute__((noinline))
15280297Sjkimcheck (__m128i x, unsigned char *v, int j)
1655714Skris{
1755714Skris  union
1855714Skris    {
1955714Skris      __m128i x;
2055714Skris      unsigned char i[16];
2155714Skris    } u;
22280297Sjkim  unsigned int i;
2355714Skris
2455714Skris  u.x = x;
2555714Skris
2655714Skris  for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
2755714Skris    if (i == j)
2855714Skris      {
2955714Skris	if (v[i] != u.i[i])
3055714Skris	  {
3155714Skris#ifdef DEBUG
3255714Skris	    printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]);
3355714Skris#endif
3455714Skris	    abort ();
3555714Skris	  }
3655714Skris      }
37280297Sjkim    else if (u.i[i] != 0)
3855714Skris      {
3955714Skris#ifdef DEBUG
40280297Sjkim	printf ("%i: 0x%x != 0\n", i, u.i[i]);
4155714Skris#endif
4255714Skris	abort ();
4355714Skris      }
4455714Skris}
4555714Skris
4655714Skrisstatic void
4755714Skris__attribute__((noinline))
4855714Skristest (unsigned char *v)
4955714Skris{
5055714Skris  __m128i x;
5155714Skris
52280297Sjkim  x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[0]);
5355714Skris  check (x, v, 0);
5455714Skris  x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[1], 0);
5555714Skris  check (x, v, 1);
5655714Skris  x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[2], 0, 0);
5755714Skris  check (x, v, 2);
5855714Skris  x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[3], 0, 0, 0);
5955714Skris  check (x, v, 3);
60280297Sjkim  x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[4], 0, 0, 0, 0);
6155714Skris  check (x, v, 4);
62280297Sjkim  x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v[5], 0, 0, 0, 0, 0);
63280297Sjkim  check (x, v, 5);
64280297Sjkim  x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, 0, v[6], 0, 0, 0, 0, 0, 0);
65280297Sjkim  check (x, v, 6);
66280297Sjkim  x = _mm_set_epi8 (0, 0, 0, 0, 0, 0, 0, 0, v[7], 0, 0, 0, 0, 0, 0, 0);
67280297Sjkim  check (x, v, 7);
68280297Sjkim}
6955714Skris
70280297Sjkimstatic void
7168651Skrissse4_1_test (void)
72280297Sjkim{
73280297Sjkim  unsigned char v[16]
74280297Sjkim    = { 0x7B, 0x5B, 0x54, 0x65, 0x73, 0x74, 0x56, 0x65,
75280297Sjkim	0x63, 0x74, 0x6F, 0x72, 0x5D, 0x53, 0x47, 0x5D };
76109998Smarkm  test (v);
77280297Sjkim}
78280297Sjkim