150
|
1 // RUN: %clang_cc1 -ffp-exception-behavior=ignore -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=FCMP
|
|
2 // RUN: %clang_cc1 -ffp-exception-behavior=strict -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=EXCEPT
|
|
3 // RUN: %clang_cc1 -ffp-exception-behavior=maytrap -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=MAYTRAP
|
|
4 // RUN: %clang_cc1 -frounding-math -ffp-exception-behavior=ignore -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=IGNORE
|
|
5 // RUN: %clang_cc1 -frounding-math -ffp-exception-behavior=strict -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=EXCEPT
|
|
6 // RUN: %clang_cc1 -frounding-math -ffp-exception-behavior=maytrap -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=MAYTRAP
|
|
7
|
|
8 _Bool QuietEqual(double f1, double f2) {
|
|
9 // CHECK-LABEL: define {{.*}}i1 @QuietEqual(double %f1, double %f2)
|
|
10
|
|
11 // FCMP: fcmp oeq double %{{.*}}, %{{.*}}
|
|
12 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"oeq", metadata !"fpexcept.ignore")
|
|
13 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"oeq", metadata !"fpexcept.strict")
|
|
14 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"oeq", metadata !"fpexcept.maytrap")
|
|
15 return f1 == f2;
|
|
16
|
|
17 // CHECK: ret
|
|
18 }
|
|
19
|
|
20 _Bool QuietNotEqual(double f1, double f2) {
|
|
21 // CHECK-LABEL: define {{.*}}i1 @QuietNotEqual(double %f1, double %f2)
|
|
22
|
|
23 // FCMP: fcmp une double %{{.*}}, %{{.*}}
|
|
24 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"une", metadata !"fpexcept.ignore")
|
|
25 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"une", metadata !"fpexcept.strict")
|
|
26 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"une", metadata !"fpexcept.maytrap")
|
|
27 return f1 != f2;
|
|
28
|
|
29 // CHECK: ret
|
|
30 }
|
|
31
|
|
32 _Bool SignalingLess(double f1, double f2) {
|
|
33 // CHECK-LABEL: define {{.*}}i1 @SignalingLess(double %f1, double %f2)
|
|
34
|
|
35 // FCMP: fcmp olt double %{{.*}}, %{{.*}}
|
|
36 // IGNORE: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"olt", metadata !"fpexcept.ignore")
|
|
37 // EXCEPT: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"olt", metadata !"fpexcept.strict")
|
|
38 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"olt", metadata !"fpexcept.maytrap")
|
|
39 return f1 < f2;
|
|
40
|
|
41 // CHECK: ret
|
|
42 }
|
|
43
|
|
44 _Bool SignalingLessEqual(double f1, double f2) {
|
|
45 // CHECK-LABEL: define {{.*}}i1 @SignalingLessEqual(double %f1, double %f2)
|
|
46
|
|
47 // FCMP: fcmp ole double %{{.*}}, %{{.*}}
|
|
48 // IGNORE: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"ole", metadata !"fpexcept.ignore")
|
|
49 // EXCEPT: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"ole", metadata !"fpexcept.strict")
|
|
50 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"ole", metadata !"fpexcept.maytrap")
|
|
51 return f1 <= f2;
|
|
52
|
|
53 // CHECK: ret
|
|
54 }
|
|
55
|
|
56 _Bool SignalingGreater(double f1, double f2) {
|
|
57 // CHECK-LABEL: define {{.*}}i1 @SignalingGreater(double %f1, double %f2)
|
|
58
|
|
59 // FCMP: fcmp ogt double %{{.*}}, %{{.*}}
|
|
60 // IGNORE: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"ogt", metadata !"fpexcept.ignore")
|
|
61 // EXCEPT: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"ogt", metadata !"fpexcept.strict")
|
|
62 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"ogt", metadata !"fpexcept.maytrap")
|
|
63 return f1 > f2;
|
|
64
|
|
65 // CHECK: ret
|
|
66 }
|
|
67
|
|
68 _Bool SignalingGreaterEqual(double f1, double f2) {
|
|
69 // CHECK-LABEL: define {{.*}}i1 @SignalingGreaterEqual(double %f1, double %f2)
|
|
70
|
|
71 // FCMP: fcmp oge double %{{.*}}, %{{.*}}
|
|
72 // IGNORE: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"oge", metadata !"fpexcept.ignore")
|
|
73 // EXCEPT: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"oge", metadata !"fpexcept.strict")
|
|
74 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmps.f64(double %{{.*}}, double %{{.*}}, metadata !"oge", metadata !"fpexcept.maytrap")
|
|
75 return f1 >= f2;
|
|
76
|
|
77 // CHECK: ret
|
|
78 }
|
|
79
|
|
80 _Bool QuietLess(double f1, double f2) {
|
|
81 // CHECK-LABEL: define {{.*}}i1 @QuietLess(double %f1, double %f2)
|
|
82
|
|
83 // FCMP: fcmp olt double %{{.*}}, %{{.*}}
|
|
84 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"olt", metadata !"fpexcept.ignore")
|
|
85 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"olt", metadata !"fpexcept.strict")
|
|
86 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"olt", metadata !"fpexcept.maytrap")
|
|
87 return __builtin_isless(f1, f2);
|
|
88
|
|
89 // CHECK: ret
|
|
90 }
|
|
91
|
|
92 _Bool QuietLessEqual(double f1, double f2) {
|
|
93 // CHECK-LABEL: define {{.*}}i1 @QuietLessEqual(double %f1, double %f2)
|
|
94
|
|
95 // FCMP: fcmp ole double %{{.*}}, %{{.*}}
|
|
96 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"ole", metadata !"fpexcept.ignore")
|
|
97 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"ole", metadata !"fpexcept.strict")
|
|
98 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"ole", metadata !"fpexcept.maytrap")
|
|
99 return __builtin_islessequal(f1, f2);
|
|
100
|
|
101 // CHECK: ret
|
|
102 }
|
|
103
|
|
104 _Bool QuietGreater(double f1, double f2) {
|
|
105 // CHECK-LABEL: define {{.*}}i1 @QuietGreater(double %f1, double %f2)
|
|
106
|
|
107 // FCMP: fcmp ogt double %{{.*}}, %{{.*}}
|
|
108 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"ogt", metadata !"fpexcept.ignore")
|
|
109 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"ogt", metadata !"fpexcept.strict")
|
|
110 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"ogt", metadata !"fpexcept.maytrap")
|
|
111 return __builtin_isgreater(f1, f2);
|
|
112
|
|
113 // CHECK: ret
|
|
114 }
|
|
115
|
|
116 _Bool QuietGreaterEqual(double f1, double f2) {
|
|
117 // CHECK-LABEL: define {{.*}}i1 @QuietGreaterEqual(double %f1, double %f2)
|
|
118
|
|
119 // FCMP: fcmp oge double %{{.*}}, %{{.*}}
|
|
120 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"oge", metadata !"fpexcept.ignore")
|
|
121 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"oge", metadata !"fpexcept.strict")
|
|
122 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"oge", metadata !"fpexcept.maytrap")
|
|
123 return __builtin_isgreaterequal(f1, f2);
|
|
124
|
|
125 // CHECK: ret
|
|
126 }
|
|
127
|
|
128 _Bool QuietLessGreater(double f1, double f2) {
|
|
129 // CHECK-LABEL: define {{.*}}i1 @QuietLessGreater(double %f1, double %f2)
|
|
130
|
|
131 // FCMP: fcmp one double %{{.*}}, %{{.*}}
|
|
132 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"one", metadata !"fpexcept.ignore")
|
|
133 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"one", metadata !"fpexcept.strict")
|
|
134 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"one", metadata !"fpexcept.maytrap")
|
|
135 return __builtin_islessgreater(f1, f2);
|
|
136
|
|
137 // CHECK: ret
|
|
138 }
|
|
139
|
|
140 _Bool QuietUnordered(double f1, double f2) {
|
|
141 // CHECK-LABEL: define {{.*}}i1 @QuietUnordered(double %f1, double %f2)
|
|
142
|
|
143 // FCMP: fcmp uno double %{{.*}}, %{{.*}}
|
|
144 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"uno", metadata !"fpexcept.ignore")
|
|
145 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"uno", metadata !"fpexcept.strict")
|
|
146 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double %{{.*}}, metadata !"uno", metadata !"fpexcept.maytrap")
|
|
147 return __builtin_isunordered(f1, f2);
|
|
148
|
|
149 // CHECK: ret
|
|
150 }
|
|
151
|