1/* { dg-do run } */ 2/* { dg-require-effective-target sse4 } */ 3/* { dg-options "-O2 -msse4.1" } */ 4 5#ifndef CHECK_H 6#define CHECK_H "sse4_1-check.h" 7#endif 8 9#ifndef TEST 10#define TEST sse4_1_test 11#endif 12 13#include CHECK_H 14 15#include <smmintrin.h> 16#include <string.h> 17 18#define msk0 0x00 19#define msk1 0x01 20#define msk2 0x02 21#define msk3 0x03 22 23static void 24TEST (void) 25{ 26 union 27 { 28 __m128i x; 29 unsigned int i[4]; 30 } res [4], val, tmp; 31 static unsigned int ins[4] = { 3, 4, 5, 6 }; 32 int masks[4]; 33 int i; 34 35 val.i[0] = 55; 36 val.i[1] = 55; 37 val.i[2] = 55; 38 val.i[3] = 55; 39 40 /* Check pinsrd imm8, r32, xmm. */ 41 res[0].x = _mm_insert_epi32 (val.x, ins[0], msk0); 42 res[1].x = _mm_insert_epi32 (val.x, ins[0], msk1); 43 res[2].x = _mm_insert_epi32 (val.x, ins[0], msk2); 44 res[3].x = _mm_insert_epi32 (val.x, ins[0], msk3); 45 46 masks[0] = msk0; 47 masks[1] = msk1; 48 masks[2] = msk2; 49 masks[3] = msk3; 50 51 for (i = 0; i < 4; i++) 52 { 53 tmp.x = val.x; 54 tmp.i[masks[i]] = ins[0]; 55 if (memcmp (&tmp, &res[i], sizeof (tmp))) 56 abort (); 57 } 58 59 /* Check pinsrd imm8, m32, xmm. */ 60 for (i = 0; i < 4; i++) 61 { 62 res[i].x = _mm_insert_epi32 (val.x, ins[i], msk0); 63 masks[i] = msk0; 64 } 65 66 for (i = 0; i < 4; i++) 67 { 68 tmp.x = val.x; 69 tmp.i[masks[i]] = ins[i]; 70 if (memcmp (&tmp, &res[i], sizeof (tmp))) 71 abort (); 72 } 73} 74