1260067Skargl/* { dg-do run } */ 2260067Skargl/* { dg-require-effective-target sse4 } */ 3260067Skargl/* { dg-options "-O2 -msse4.1" } */ 4260067Skargl 5260067Skargl#include "sse4_1-check.h" 6260067Skargl 7260067Skargl#ifdef DEBUG 8260067Skargl#include <stdio.h> 9260067Skargl#endif 10260067Skargl 11260067Skargl#include <emmintrin.h> 12260067Skargl 13260067Skarglstatic void 14260067Skargl__attribute__((noinline)) 15260067Skarglcheck (__m128i x, unsigned int *v, int j) 16260067Skargl{ 17260067Skargl union 18260067Skargl { 19260067Skargl __m128i x; 20260067Skargl unsigned int i[4]; 21260067Skargl } u; 22260067Skargl unsigned int i; 23260067Skargl 24260067Skargl u.x = x; 25260067Skargl 26260067Skargl for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) 27260067Skargl if (i == j) 28260067Skargl { 29260067Skargl if (v[i] != u.i[i]) 30260067Skargl { 31260067Skargl#ifdef DEBUG 32260067Skargl printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]); 33260067Skargl#endif 34260067Skargl abort (); 35260067Skargl } 36260067Skargl } 37260067Skargl else if (u.i[i] != 0) 38260067Skargl { 39260067Skargl#ifdef DEBUG 40260067Skargl printf ("%i: 0x%x != 0\n", i, u.i[i]); 41260067Skargl#endif 42260067Skargl abort (); 43260067Skargl } 44260067Skargl} 45260067Skargl 46260067Skarglstatic void 47260067Skargl__attribute__((noinline)) 48260067Skargltest (unsigned int *v) 49260067Skargl{ 50260067Skargl __m128i x; 51260067Skargl 52260067Skargl x = _mm_set_epi32 (0, 0, 0, v[0]); 53260067Skargl check (x, v, 0); 54260067Skargl x = _mm_set_epi32 (0, 0, v[1], 0); 55260067Skargl check (x, v, 1); 56260067Skargl x = _mm_set_epi32 (0, v[2], 0, 0); 57260067Skargl check (x, v, 2); 58260067Skargl x = _mm_set_epi32 (v[3], 0, 0, 0); 59260067Skargl check (x, v, 3); 60260067Skargl} 61260067Skargl 62260067Skarglstatic void 63260067Skarglsse4_1_test (void) 64260067Skargl{ 65260067Skargl unsigned int v[4] 66260067Skargl = { 0x7B5B5465, 0x73745665, 0x63746F72, 0x5D53475D }; 67260067Skargl test (v); 68260067Skargl} 69260067Skargl