]> git.ipfire.org Git - thirdparty/gcc.git/blob
e638b12a5ee2264ecef77acca86432a9f24b103b
[thirdparty/gcc.git] /
1 /* { dg-do run { target sse4 } } */
2 /* { dg-options " -O2 -msse4.1 -mfpmath=sse -std=gnu++20" } */
3 #include <math.h>
4
5 #ifndef CHECK_H
6 #define CHECK_H "sse4_1-check.h"
7 #endif
8
9 #ifndef TEST
10 #define TEST sse4_1_test
11 #endif
12
13 #include CHECK_H
14
15 void
16 __attribute__((noinline))
17 __cond_swap(double* __x, double* __y) {
18 bool __r = (*__x < *__y);
19 auto __tmp = __r ? *__x : *__y;
20 *__y = __r ? *__y : *__x;
21 *__x = __tmp;
22 }
23
24 auto test1() {
25 double nan = -0.0;
26 double x = 0.0;
27 __cond_swap(&nan, &x);
28 return x == -0.0 && nan == 0.0;
29 }
30
31 auto test1r() {
32 double nan = NAN;
33 double x = 1.0;
34 __cond_swap(&x, &nan);
35 return isnan(x) && signbit(x) == 0 && nan == 1.0;
36 }
37
38 auto test2() {
39 double nan = NAN;
40 double x = -1.0;
41 __cond_swap(&nan, &x);
42 return isnan(x) && signbit(x) == 0 && nan == -1.0;
43 }
44
45 auto test2r() {
46 double nan = NAN;
47 double x = -1.0;
48 __cond_swap(&x, &nan);
49 return isnan(x) && signbit(x) == 0 && nan == -1.0;
50 }
51
52 auto test3() {
53 double nan = -NAN;
54 double x = 1.0;
55 __cond_swap(&nan, &x);
56 return isnan(x) && signbit(x) == 1 && nan == 1.0;
57 }
58
59 auto test3r() {
60 double nan = -NAN;
61 double x = 1.0;
62 __cond_swap(&x, &nan);
63 return isnan(x) && signbit(x) == 1 && nan == 1.0;
64 }
65
66 auto test4() {
67 double nan = -NAN;
68 double x = -1.0;
69 __cond_swap(&nan, &x);
70 return isnan(x) && signbit(x) == 1 && nan == -1.0;
71 }
72
73 auto test4r() {
74 double nan = -NAN;
75 double x = -1.0;
76 __cond_swap(&x, &nan);
77 return isnan(x) && signbit(x) == 1 && nan == -1.0;
78 }
79
80
81 static void
82 TEST()
83 {
84 if (
85 !test1() || !test1r()
86 || !test2() || !test2r()
87 || !test3() || !test4r()
88 || !test4() || !test4r()
89 ) __builtin_abort();
90 }