1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx2 -mno-avx512f" } */
       3  /* { dg-require-effective-target avx512vl } */
       4  
       5  #define AVX512VL
       6  
       7  #include "avx512f-helper.h"
       8  
       9  #include "pr101989-1.c"
      10  __m256d
      11  avx2_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  avx2_foo (__m256i src1, __m256i src2, __m256i src3)
      20  {
      21    return (src2 & ~src1) | (src3 & src1);
      22  }
      23  
      24  __m256i
      25  avx2_foo1 (__m256i src1, __m256i src2, __m256i src3)
      26  {
      27    return (src2 & src1) | (src3 & ~src1);
      28  }
      29  
      30  __m256i
      31  avx2_foo2 (__m256i src1, __m256i src2, __m256i src3)
      32  {
      33    return (src2 & src1) | (~src3 & src1);
      34  }
      35  
      36  __m256i
      37  avx2_foo3 (__m256i src1, __m256i src2, __m256i src3)
      38  {
      39    return (~src2 & src1) | (src3 & src1);
      40  }
      41  
      42  __m256i
      43  avx2_foo4 (__m256i src1, __m256i src2, __m256i src3)
      44  {
      45    return src3 & src2 ^ src1;
      46  }
      47  
      48  
      49  void
      50  test_256 (void)
      51  {
      52    union256i_q q1, q2, q3, res2, exp2;
      53    union256d d1, d2, res1, exp1;
      54    int i, sign = 1;
      55  
      56    for (i = 0; i < 4; i++)
      57      {
      58        d1.a[i] = 12.34 * (i + 2000) * sign;
      59        d2.a[i] = 56.78 * (i - 30) * sign;
      60        q1.a[i] = 12 * (i + 2000) * sign;
      61        q2.a[i] = 56 * (i - 30) * sign;
      62        q3.a[i] = 90 * (i + 40) * sign;
      63        res1.a[i] = DEFAULT_VALUE;
      64        exp1.a[i] = DEFAULT_VALUE;
      65        res2.a[i] = exp2.a[i] = -1;
      66        sign = -sign;
      67      }
      68  
      69    exp1.x = avx2_copysign2_pd (d1.x, d2.x);
      70    res1.x = copysign2_pd (d1.x, d2.x);
      71    if (UNION_CHECK (256, d) (res1, exp1.a))
      72      abort ();
      73  
      74    exp2.x = avx2_foo1 (q1.x, q2.x, q3.x);
      75    res2.x = foo1 (q1.x, q2.x, q3.x);
      76    if (UNION_CHECK (256, i_q) (res2, exp2.a))
      77      abort ();
      78  
      79    exp2.x = avx2_foo2 (q1.x, q2.x, q3.x);
      80    res2.x = foo2 (q1.x, q2.x, q3.x);
      81    if (UNION_CHECK (256, i_q) (res2, exp2.a))
      82      abort ();
      83  
      84    exp2.x = avx2_foo3 (q1.x, q2.x, q3.x);
      85    res2.x = foo3 (q1.x, q2.x, q3.x);
      86    if (UNION_CHECK (256, i_q) (res2, exp2.a))
      87      abort ();
      88  
      89    exp2.x = avx2_foo4 (q1.x, q2.x, q3.x);
      90    res2.x = foo4 (q1.x, q2.x, q3.x);
      91    if (UNION_CHECK (256, i_q) (res2, exp2.a))
      92      abort ();
      93  
      94    exp2.x = avx2_foo (q1.x, q2.x, q3.x);
      95    res2.x = foo (q1.x, q2.x, q3.x);
      96    if (UNION_CHECK (256, i_q) (res2, exp2.a))
      97      abort ();
      98  }
      99  
     100  static void
     101  test_128 ()
     102  {}