1  /* { dg-do run } */
       2  /* { dg-options "-O2 --save-temps" } */
       3  
       4  double fabs (double);
       5  
       6  double
       7  check (double x, double y)
       8  {
       9    return __builtin_copysign (x, y);
      10  }
      11  
      12  double
      13  check1 (double x)
      14  {
      15    return __builtin_copysign (x, 1.0);
      16  }
      17  
      18  double
      19  check2 (double x)
      20  {
      21    return __builtin_copysign (1.0, x);
      22  }
      23  
      24  double
      25  check3 (double x)
      26  {
      27    return -__builtin_copysign (x, 1.0);
      28  }
      29  
      30  double
      31  check4 (double x, double y)
      32  {
      33    return x * __builtin_copysign (x, y);
      34  }
      35  
      36  double
      37  check5 (double x, double y)
      38  {
      39    return __builtin_copysign (-x, -y);
      40  }
      41  
      42  int
      43  main (int argc, char** argv)
      44  {
      45    double x = 2.0;
      46    double y = -5.0;
      47    double epsilon = 0.00001;
      48  
      49    double expected = -2.0;
      50  
      51    if (fabs (check (x, y) - expected) >= epsilon)
      52      __builtin_abort ();
      53  
      54    expected = 2.0;
      55  
      56    if (fabs (check1 (x) - expected) >= epsilon)
      57      __builtin_abort ();
      58  
      59    expected = 1.0;
      60  
      61    if (fabs (check2 (x) - expected) >= epsilon)
      62      __builtin_abort ();
      63  
      64    expected = -2.0;
      65  
      66    if (fabs (check3 (x) - expected) >= epsilon)
      67      __builtin_abort ();
      68  
      69    expected = -4.0;
      70  
      71    if (fabs (check4 (x, y) - expected) >= epsilon)
      72      __builtin_abort ();
      73  
      74    expected = 2.0;
      75  
      76    if (fabs (check5 (x, y) - expected) >= epsilon)
      77      __builtin_abort ();
      78  }
      79  
      80  /* { dg-final { scan-assembler-not "copysign\tw" } } */
      81