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