1  /* { dg-do compile } */
       2  /* { dg-options "-O2" } */
       3  /* { dg-final { scan-assembler-times "vpternlog" 6 } } */
       4  /* { dg-final { scan-assembler-not "vpxor" } } */
       5  /* { dg-final { scan-assembler-not "vpor" } } */
       6  /* { dg-final { scan-assembler-not "vpand" } } */
       7  
       8  #include<immintrin.h>
       9  __m256d
      10  __attribute__((noipa, target("avx512vl")))
      11  copysign2_pd(__m256d from, __m256d to) {
      12    __m256i a = _mm256_castpd_si256(from);
      13    __m256d avx_signbit = _mm256_castsi256_pd(_mm256_slli_epi64(_mm256_cmpeq_epi64(a, a), 63));
      14    /* (avx_signbit & from) | (~avx_signbit & to)  */
      15    return _mm256_or_pd(_mm256_and_pd(avx_signbit, from), _mm256_andnot_pd(avx_signbit, to));
      16  }
      17  
      18  __m256i
      19  __attribute__((noipa, target("avx512vl")))
      20  foo (__m256i src1, __m256i src2, __m256i src3)
      21  {
      22    return (src2 & ~src1) | (src3 & src1);
      23  }
      24  
      25  __m256i
      26  __attribute__ ((noipa, target("avx512vl")))
      27  foo1 (__m256i src1, __m256i src2, __m256i src3)
      28  {
      29    return (src2 & src1) | (src3 & ~src1);
      30  }
      31  
      32  __m256i
      33  __attribute__ ((noipa, target("avx512vl")))
      34  foo2 (__m256i src1, __m256i src2, __m256i src3)
      35  {
      36    return (src2 & src1) | (~src3 & src1);
      37  }
      38  
      39  __m256i
      40  __attribute__ ((noipa, target("avx512vl")))
      41  foo3 (__m256i src1, __m256i src2, __m256i src3)
      42  {
      43    return (~src2 & src1) | (src3 & src1);
      44  }
      45  
      46  __m256i
      47  __attribute__ ((noipa, target("avx512vl")))
      48  foo4 (__m256i src1, __m256i src2, __m256i src3)
      49  {
      50    return src3 & src2 ^ src1;
      51  }