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#define msk4 0x04 23#define msk5 0x05 24#define msk6 0x06 25#define msk7 0x07 26#define msk8 0x08 27#define msk9 0x09 28#define mskA 0x0A 29#define mskB 0x0B 30#define mskC 0x0C 31#define mskD 0x0D 32#define mskE 0x0E 33#define mskF 0x0F 34 35static void 36TEST (void) 37{ 38 union 39 { 40 __m128i x; 41 unsigned int i[4]; 42 unsigned char c[16]; 43 } res [16], val, tmp; 44 int masks[16]; 45 unsigned char ins[4] = { 3, 4, 5, 6 }; 46 int i; 47 48 val.i[0] = 0x35251505; 49 val.i[1] = 0x75655545; 50 val.i[2] = 0xB5A59585; 51 val.i[3] = 0xF5E5D5C5; 52 53 /* Check pinsrb imm8, r32, xmm. */ 54 res[0].x = _mm_insert_epi8 (val.x, ins[0], msk0); 55 res[1].x = _mm_insert_epi8 (val.x, ins[0], msk1); 56 res[2].x = _mm_insert_epi8 (val.x, ins[0], msk2); 57 res[3].x = _mm_insert_epi8 (val.x, ins[0], msk3); 58 res[4].x = _mm_insert_epi8 (val.x, ins[0], msk4); 59 res[5].x = _mm_insert_epi8 (val.x, ins[0], msk5); 60 res[6].x = _mm_insert_epi8 (val.x, ins[0], msk6); 61 res[7].x = _mm_insert_epi8 (val.x, ins[0], msk7); 62 res[8].x = _mm_insert_epi8 (val.x, ins[0], msk8); 63 res[9].x = _mm_insert_epi8 (val.x, ins[0], msk9); 64 res[10].x = _mm_insert_epi8 (val.x, ins[0], mskA); 65 res[11].x = _mm_insert_epi8 (val.x, ins[0], mskB); 66 res[12].x = _mm_insert_epi8 (val.x, ins[0], mskC); 67 res[13].x = _mm_insert_epi8 (val.x, ins[0], mskD); 68 res[14].x = _mm_insert_epi8 (val.x, ins[0], mskE); 69 res[15].x = _mm_insert_epi8 (val.x, ins[0], mskF); 70 71 masks[0] = msk0; 72 masks[1] = msk1; 73 masks[2] = msk2; 74 masks[3] = msk3; 75 masks[4] = msk4; 76 masks[5] = msk5; 77 masks[6] = msk6; 78 masks[7] = msk7; 79 masks[8] = msk8; 80 masks[9] = msk9; 81 masks[10] = mskA; 82 masks[11] = mskB; 83 masks[12] = mskC; 84 masks[13] = mskD; 85 masks[14] = mskE; 86 masks[15] = mskF; 87 88 for (i = 0; i < 16; i++) 89 { 90 tmp.x = val.x; 91 tmp.c[masks[i]] = ins[0]; 92 if (memcmp (&tmp, &res[i], sizeof (tmp))) 93 abort (); 94 } 95 96 /* Check pinsrb imm8, m8, xmm. */ 97 for (i = 0; i < 16; i++) 98 { 99 res[i].x = _mm_insert_epi8 (val.x, ins[i % 4], msk0); 100 masks[i] = msk0; 101 } 102 103 for (i = 0; i < 16; i++) 104 { 105 tmp.x = val.x; 106 tmp.c[masks[i]] = ins[i % 4]; 107 if (memcmp (&tmp, &res[i], sizeof (tmp))) 108 abort (); 109 } 110} 111