1/* { dg-do run } */ 2/* { dg-require-effective-target sse2 } */ 3/* { dg-options "-O2 -msse2" } */ 4 5#ifndef CHECK_H 6#define CHECK_H "sse2-check.h" 7#endif 8 9#ifndef TEST 10#define TEST sse2_test 11#endif 12 13#include CHECK_H 14 15#include <emmintrin.h> 16#include <string.h> 17 18#define msk0 0x00 19#define msk1 0x01 20#define msk2 0x02 21#define msk3 0x03 22#define msk4 0x04 23#define msk5 0x05 24#define msk6 0x06 25#define msk7 0x07 26 27static void 28TEST (void) 29{ 30 union 31 { 32 __m128i x; 33 unsigned int i[4]; 34 unsigned short s[8]; 35 } res [8], val, tmp; 36 int masks[8]; 37 unsigned short ins[4] = { 3, 4, 5, 6 }; 38 int i; 39 40 val.i[0] = 0x35251505; 41 val.i[1] = 0x75655545; 42 val.i[2] = 0xB5A59585; 43 val.i[3] = 0xF5E5D5C5; 44 45 /* Check pinsrw imm8, r32, xmm. */ 46 res[0].x = _mm_insert_epi16 (val.x, ins[0], msk0); 47 res[1].x = _mm_insert_epi16 (val.x, ins[0], msk1); 48 res[2].x = _mm_insert_epi16 (val.x, ins[0], msk2); 49 res[3].x = _mm_insert_epi16 (val.x, ins[0], msk3); 50 res[4].x = _mm_insert_epi16 (val.x, ins[0], msk4); 51 res[5].x = _mm_insert_epi16 (val.x, ins[0], msk5); 52 res[6].x = _mm_insert_epi16 (val.x, ins[0], msk6); 53 res[7].x = _mm_insert_epi16 (val.x, ins[0], msk7); 54 55 masks[0] = msk0; 56 masks[1] = msk1; 57 masks[2] = msk2; 58 masks[3] = msk3; 59 masks[4] = msk4; 60 masks[5] = msk5; 61 masks[6] = msk6; 62 masks[7] = msk7; 63 64 for (i = 0; i < 8; i++) 65 { 66 tmp.x = val.x; 67 tmp.s[masks[i]] = ins[0]; 68 if (memcmp (&tmp, &res[i], sizeof (tmp))) 69 abort (); 70 } 71 72 /* Check pinsrw imm8, m16, xmm. */ 73 for (i = 0; i < 8; i++) 74 { 75 res[i].x = _mm_insert_epi16 (val.x, ins[i % 2], msk0); 76 masks[i] = msk0; 77 } 78 79 for (i = 0; i < 8; i++) 80 { 81 tmp.x = val.x; 82 tmp.s[masks[i]] = ins[i % 2]; 83 if (memcmp (&tmp, &res[i], sizeof (tmp))) 84 abort (); 85 } 86} 87