1 /* { dg-do run } */
2 /* { dg-options "-O2 --save-temps" } */
3 
4 double fabs (double);
5 
6 double
check(double x,double y)7 check (double x, double y)
8 {
9   return __builtin_copysign (x, y);
10 }
11 
12 double
check1(double x)13 check1 (double x)
14 {
15   return __builtin_copysign (x, 1.0);
16 }
17 
18 double
check2(double x)19 check2 (double x)
20 {
21   return __builtin_copysign (1.0, x);
22 }
23 
24 double
check3(double x)25 check3 (double x)
26 {
27   return -__builtin_copysign (x, 1.0);
28 }
29 
30 double
check4(double x,double y)31 check4 (double x, double y)
32 {
33   return x * __builtin_copysign (x, y);
34 }
35 
36 double
check5(double x,double y)37 check5 (double x, double y)
38 {
39   return __builtin_copysign (-x, -y);
40 }
41 
42 int
main(int argc,char ** argv)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 
82