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