1238438Sdteske/* { dg-do run } */ 2238438Sdteske/* { dg-require-effective-target lp64 } */ 3238438Sdteske/* { dg-require-effective-target sse4 } */ 4238438Sdteske/* { dg-options "-O2 -msse4.1" } */ 5240684Sdteske 6238438Sdteske#ifndef CHECK_H 7238438Sdteske#define CHECK_H "sse4_1-check.h" 8238438Sdteske#endif 9238438Sdteske 10238438Sdteske#ifndef TEST 11238438Sdteske#define TEST sse4_1_test 12238438Sdteske#endif 13238438Sdteske 14238438Sdteske#include CHECK_H 15238438Sdteske 16238438Sdteske#include <smmintrin.h> 17#include <string.h> 18 19#define msk0 0x00 20#define msk1 0x01 21 22static void 23__attribute__((noinline)) 24TEST (void) 25{ 26 union 27 { 28 __m128i x; 29 unsigned long long ll[2]; 30 } res [4], val, tmp; 31 int masks[4]; 32 static unsigned long long ins[2] = 33 { 0xAABBAABBAABBAABBLL, 0xCCDDCCDDCCDDCCDDLL }; 34 int i; 35 36 val.ll[0] = 0x0807060504030201LL; 37 val.ll[1] = 0x100F0E0D0C0B0A09LL; 38 39 /* Check pinsrq imm8, r64, xmm. */ 40 res[0].x = _mm_insert_epi64 (val.x, ins[0], msk0); 41 res[1].x = _mm_insert_epi64 (val.x, ins[0], msk1); 42 43 masks[0] = msk0; 44 masks[1] = msk1; 45 46 for (i = 0; i < 2; i++) 47 { 48 tmp.x = val.x; 49 tmp.ll[masks[i]] = ins[0]; 50 if (memcmp (&tmp, &res[i], sizeof (tmp))) 51 abort (); 52 } 53 54 /* Check pinsrq imm8, m64, xmm. */ 55 for (i = 0; i < 2; i++) 56 { 57 res[i].x = _mm_insert_epi64 (val.x, ins[i], msk0); 58 masks[i] = msk0; 59 } 60 61 for (i = 0; i < 2; i++) 62 { 63 tmp.x = val.x; 64 tmp.ll[masks[i]] = ins[i]; 65 if (memcmp (&tmp, &res[i], sizeof (tmp))) 66 abort (); 67 } 68} 69