1  /* { dg-do run { target { ! ia32 } } } */
       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  
      21  static void
      22  __attribute__((noinline))
      23  TEST (void)
      24  {
      25    union
      26      {
      27        __m128i x;
      28        unsigned long long ll[2];
      29      } res [4], val, tmp;
      30    int masks[4];
      31    static unsigned long long ins[2] =
      32      { 0xAABBAABBAABBAABBLL, 0xCCDDCCDDCCDDCCDDLL };
      33    int i;
      34  
      35    val.ll[0] = 0x0807060504030201LL;
      36    val.ll[1] = 0x100F0E0D0C0B0A09LL;
      37  
      38    /* Check pinsrq imm8, r64, xmm.  */
      39    res[0].x = _mm_insert_epi64 (val.x, ins[0], msk0);
      40    res[1].x = _mm_insert_epi64 (val.x, ins[0], msk1);
      41  
      42    masks[0] = msk0;
      43    masks[1] = msk1;
      44  
      45    for (i = 0; i < 2; i++)
      46      {
      47        tmp.x = val.x;
      48        tmp.ll[masks[i]] = ins[0];
      49        if (memcmp (&tmp, &res[i], sizeof (tmp)))
      50  	abort ();
      51      }
      52      
      53    /* Check pinsrq imm8, m64, xmm.  */
      54    for (i = 0; i < 2; i++)
      55      {
      56        res[i].x = _mm_insert_epi64 (val.x, ins[i], msk0);
      57        masks[i] = msk0;
      58      }
      59  
      60    for (i = 0; i < 2; i++)
      61      {
      62        tmp.x = val.x;
      63        tmp.ll[masks[i]] = ins[i];
      64        if (memcmp (&tmp, &res[i], sizeof (tmp)))
      65  	abort ();
      66      }
      67  }