(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
sse4_1-pblendvb.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mpower8-vector -Wno-psabi" } */
       3  /* { dg-require-effective-target p8vector_hw } */
       4  
       5  #define NO_WARN_X86_INTRINSICS 1
       6  #ifndef CHECK_H
       7  #define CHECK_H "sse4_1-check.h"
       8  #endif
       9  
      10  #ifndef TEST
      11  #define TEST sse4_1_test
      12  #endif
      13  
      14  #include CHECK_H
      15  
      16  #include <smmintrin.h>
      17  #include <string.h>
      18  
      19  #define NUM 20
      20  
      21  static void
      22  init_pblendvb (unsigned char *src1, unsigned char *src2,
      23  	       unsigned char *mask)
      24  {
      25    int i, sign = 1; 
      26  
      27    for (i = 0; i < NUM * 16; i++)
      28      {
      29        src1[i] = i* i * sign;
      30        src2[i] = (i + 20) * sign;
      31        mask[i] = (i % 3) + ((i * (14 + sign))
      32  			   ^ (src1[i] | src2[i] | (i*3)));
      33        sign = -sign;
      34      }
      35  }
      36  
      37  static int
      38  check_pblendvb (__m128i *dst, unsigned char *src1,
      39  		unsigned char *src2, unsigned char *mask)
      40  {
      41    unsigned char tmp[16];
      42    int j;
      43  
      44    memcpy (&tmp[0], src1, sizeof (tmp));
      45    for (j = 0; j < 16; j++)
      46      if (mask [j] & 0x80)
      47        tmp[j] = src2[j];
      48  
      49    return memcmp (dst, &tmp[0], sizeof (tmp));
      50  }
      51  
      52  static void
      53  TEST (void)
      54  {
      55    union
      56      {
      57        __m128i x[NUM];
      58        unsigned char c[NUM * 16];
      59      } dst, src1, src2, mask;
      60    int i;
      61  
      62    init_pblendvb (src1.c, src2.c, mask.c);
      63  
      64    for (i = 0; i < NUM; i++)
      65      {
      66        dst.x[i] = _mm_blendv_epi8 (src1.x[i], src2.x[i], mask.x[i]);
      67        if (check_pblendvb (&dst.x[i], &src1.c[i * 16], &src2.c[i * 16],
      68  			  &mask.c[i * 16]))
      69  	abort ();
      70      }
      71  }