1// RUN: split-file %s %t
2// TODO: verify that Fast-Math Flags and 'strictfp' are properly set.
3
4//--- abs_fast.fir
5// RUN: fir-opt %t/abs_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/abs_fast.fir
6// CHECK: @_QPtest_real4
7// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.fabs"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
8
9// CHECK: @_QPtest_real8
10// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.fabs"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
11
12// CHECK: @_QPtest_real16
13// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.fabs"({{%[A-Za-z0-9._]+}}) : (f128) -> f128
14
15// CHECK: @_QPtest_complex4
16// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @hypotf({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
17
18// CHECK: @_QPtest_complex8
19// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @hypot({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
20
21func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
22  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
23  %1 = fir.load %arg0 : !fir.ref<f32>
24  %2 = math.abs %1 : f32
25  fir.store %2 to %0 : !fir.ref<f32>
26  %3 = fir.load %0 : !fir.ref<f32>
27  return %3 : f32
28}
29func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
30  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
31  %1 = fir.load %arg0 : !fir.ref<f64>
32  %2 = math.abs %1 : f64
33  fir.store %2 to %0 : !fir.ref<f64>
34  %3 = fir.load %0 : !fir.ref<f64>
35  return %3 : f64
36}
37func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}) -> f128 {
38  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
39  %1 = fir.load %arg0 : !fir.ref<f128>
40  %2 = math.abs %1 : f128
41  fir.store %2 to %0 : !fir.ref<f128>
42  %3 = fir.load %0 : !fir.ref<f128>
43  return %3 : f128
44}
45func.func @_QPtest_complex4(%arg0: !fir.ref<!fir.complex<4>> {fir.bindc_name = "c"}) -> !fir.complex<4> {
46  %0 = fir.alloca !fir.complex<4> {bindc_name = "test_complex4", uniq_name = "_QFtest_complex4Etest_complex4"}
47  %1 = fir.load %arg0 : !fir.ref<!fir.complex<4>>
48  %2 = fir.extract_value %1, [0 : index] : (!fir.complex<4>) -> f32
49  %3 = fir.extract_value %1, [1 : index] : (!fir.complex<4>) -> f32
50  %4 = fir.call @hypotf(%2, %3) : (f32, f32) -> f32
51  %cst = arith.constant 0.000000e+00 : f32
52  %5 = fir.undefined !fir.complex<4>
53  %6 = fir.insert_value %5, %4, [0 : index] : (!fir.complex<4>, f32) -> !fir.complex<4>
54  %7 = fir.insert_value %6, %cst, [1 : index] : (!fir.complex<4>, f32) -> !fir.complex<4>
55  fir.store %7 to %0 : !fir.ref<!fir.complex<4>>
56  %8 = fir.load %0 : !fir.ref<!fir.complex<4>>
57  return %8 : !fir.complex<4>
58}
59func.func @_QPtest_complex8(%arg0: !fir.ref<!fir.complex<8>> {fir.bindc_name = "c"}) -> !fir.complex<8> {
60  %0 = fir.alloca !fir.complex<8> {bindc_name = "test_complex8", uniq_name = "_QFtest_complex8Etest_complex8"}
61  %1 = fir.load %arg0 : !fir.ref<!fir.complex<8>>
62  %2 = fir.extract_value %1, [0 : index] : (!fir.complex<8>) -> f64
63  %3 = fir.extract_value %1, [1 : index] : (!fir.complex<8>) -> f64
64  %4 = fir.call @hypot(%2, %3) : (f64, f64) -> f64
65  %cst = arith.constant 0.000000e+00 : f64
66  %5 = fir.undefined !fir.complex<8>
67  %6 = fir.insert_value %5, %4, [0 : index] : (!fir.complex<8>, f64) -> !fir.complex<8>
68  %7 = fir.insert_value %6, %cst, [1 : index] : (!fir.complex<8>, f64) -> !fir.complex<8>
69  fir.store %7 to %0 : !fir.ref<!fir.complex<8>>
70  %8 = fir.load %0 : !fir.ref<!fir.complex<8>>
71  return %8 : !fir.complex<8>
72}
73func.func private @hypotf(f32, f32) -> f32
74func.func private @hypot(f64, f64) -> f64
75
76//--- abs_relaxed.fir
77// RUN: fir-opt %t/abs_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/abs_relaxed.fir
78// CHECK: @_QPtest_real4
79// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.fabs"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
80
81// CHECK: @_QPtest_real8
82// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.fabs"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
83
84// CHECK: @_QPtest_real16
85// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.fabs"({{%[A-Za-z0-9._]+}}) : (f128) -> f128
86
87// CHECK: @_QPtest_complex4
88// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @hypotf({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
89
90// CHECK: @_QPtest_complex8
91// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @hypot({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
92
93func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
94  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
95  %1 = fir.load %arg0 : !fir.ref<f32>
96  %2 = math.abs %1 : f32
97  fir.store %2 to %0 : !fir.ref<f32>
98  %3 = fir.load %0 : !fir.ref<f32>
99  return %3 : f32
100}
101func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
102  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
103  %1 = fir.load %arg0 : !fir.ref<f64>
104  %2 = math.abs %1 : f64
105  fir.store %2 to %0 : !fir.ref<f64>
106  %3 = fir.load %0 : !fir.ref<f64>
107  return %3 : f64
108}
109func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}) -> f128 {
110  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
111  %1 = fir.load %arg0 : !fir.ref<f128>
112  %2 = math.abs %1 : f128
113  fir.store %2 to %0 : !fir.ref<f128>
114  %3 = fir.load %0 : !fir.ref<f128>
115  return %3 : f128
116}
117func.func @_QPtest_complex4(%arg0: !fir.ref<!fir.complex<4>> {fir.bindc_name = "c"}) -> !fir.complex<4> {
118  %0 = fir.alloca !fir.complex<4> {bindc_name = "test_complex4", uniq_name = "_QFtest_complex4Etest_complex4"}
119  %1 = fir.load %arg0 : !fir.ref<!fir.complex<4>>
120  %2 = fir.extract_value %1, [0 : index] : (!fir.complex<4>) -> f32
121  %3 = fir.extract_value %1, [1 : index] : (!fir.complex<4>) -> f32
122  %4 = fir.call @hypotf(%2, %3) : (f32, f32) -> f32
123  %cst = arith.constant 0.000000e+00 : f32
124  %5 = fir.undefined !fir.complex<4>
125  %6 = fir.insert_value %5, %4, [0 : index] : (!fir.complex<4>, f32) -> !fir.complex<4>
126  %7 = fir.insert_value %6, %cst, [1 : index] : (!fir.complex<4>, f32) -> !fir.complex<4>
127  fir.store %7 to %0 : !fir.ref<!fir.complex<4>>
128  %8 = fir.load %0 : !fir.ref<!fir.complex<4>>
129  return %8 : !fir.complex<4>
130}
131func.func @_QPtest_complex8(%arg0: !fir.ref<!fir.complex<8>> {fir.bindc_name = "c"}) -> !fir.complex<8> {
132  %0 = fir.alloca !fir.complex<8> {bindc_name = "test_complex8", uniq_name = "_QFtest_complex8Etest_complex8"}
133  %1 = fir.load %arg0 : !fir.ref<!fir.complex<8>>
134  %2 = fir.extract_value %1, [0 : index] : (!fir.complex<8>) -> f64
135  %3 = fir.extract_value %1, [1 : index] : (!fir.complex<8>) -> f64
136  %4 = fir.call @hypot(%2, %3) : (f64, f64) -> f64
137  %cst = arith.constant 0.000000e+00 : f64
138  %5 = fir.undefined !fir.complex<8>
139  %6 = fir.insert_value %5, %4, [0 : index] : (!fir.complex<8>, f64) -> !fir.complex<8>
140  %7 = fir.insert_value %6, %cst, [1 : index] : (!fir.complex<8>, f64) -> !fir.complex<8>
141  fir.store %7 to %0 : !fir.ref<!fir.complex<8>>
142  %8 = fir.load %0 : !fir.ref<!fir.complex<8>>
143  return %8 : !fir.complex<8>
144}
145func.func private @hypotf(f32, f32) -> f32
146func.func private @hypot(f64, f64) -> f64
147
148//--- abs_precise.fir
149// RUN: fir-opt %t/abs_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/abs_precise.fir
150// CHECK: @_QPtest_real4
151// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @fabsf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
152
153// CHECK: @_QPtest_real8
154// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @fabs({{%[A-Za-z0-9._]+}}) : (f64) -> f64
155
156// CHECK: @_QPtest_real16
157// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.fabs.f128({{%[A-Za-z0-9._]+}}) : (f128) -> f128
158
159// CHECK: @_QPtest_complex4
160// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @hypotf({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
161
162// CHECK: @_QPtest_complex8
163// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @hypot({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
164
165func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
166  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
167  %1 = fir.load %arg0 : !fir.ref<f32>
168  %2 = fir.call @fabsf(%1) : (f32) -> f32
169  fir.store %2 to %0 : !fir.ref<f32>
170  %3 = fir.load %0 : !fir.ref<f32>
171  return %3 : f32
172}
173func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
174  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
175  %1 = fir.load %arg0 : !fir.ref<f64>
176  %2 = fir.call @fabs(%1) : (f64) -> f64
177  fir.store %2 to %0 : !fir.ref<f64>
178  %3 = fir.load %0 : !fir.ref<f64>
179  return %3 : f64
180}
181func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}) -> f128 {
182  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
183  %1 = fir.load %arg0 : !fir.ref<f128>
184  %2 = fir.call @llvm.fabs.f128(%1) : (f128) -> f128
185  fir.store %2 to %0 : !fir.ref<f128>
186  %3 = fir.load %0 : !fir.ref<f128>
187  return %3 : f128
188}
189func.func @_QPtest_complex4(%arg0: !fir.ref<!fir.complex<4>> {fir.bindc_name = "c"}) -> !fir.complex<4> {
190  %0 = fir.alloca !fir.complex<4> {bindc_name = "test_complex4", uniq_name = "_QFtest_complex4Etest_complex4"}
191  %1 = fir.load %arg0 : !fir.ref<!fir.complex<4>>
192  %2 = fir.extract_value %1, [0 : index] : (!fir.complex<4>) -> f32
193  %3 = fir.extract_value %1, [1 : index] : (!fir.complex<4>) -> f32
194  %4 = fir.call @hypotf(%2, %3) : (f32, f32) -> f32
195  %cst = arith.constant 0.000000e+00 : f32
196  %5 = fir.undefined !fir.complex<4>
197  %6 = fir.insert_value %5, %4, [0 : index] : (!fir.complex<4>, f32) -> !fir.complex<4>
198  %7 = fir.insert_value %6, %cst, [1 : index] : (!fir.complex<4>, f32) -> !fir.complex<4>
199  fir.store %7 to %0 : !fir.ref<!fir.complex<4>>
200  %8 = fir.load %0 : !fir.ref<!fir.complex<4>>
201  return %8 : !fir.complex<4>
202}
203func.func @_QPtest_complex8(%arg0: !fir.ref<!fir.complex<8>> {fir.bindc_name = "c"}) -> !fir.complex<8> {
204  %0 = fir.alloca !fir.complex<8> {bindc_name = "test_complex8", uniq_name = "_QFtest_complex8Etest_complex8"}
205  %1 = fir.load %arg0 : !fir.ref<!fir.complex<8>>
206  %2 = fir.extract_value %1, [0 : index] : (!fir.complex<8>) -> f64
207  %3 = fir.extract_value %1, [1 : index] : (!fir.complex<8>) -> f64
208  %4 = fir.call @hypot(%2, %3) : (f64, f64) -> f64
209  %cst = arith.constant 0.000000e+00 : f64
210  %5 = fir.undefined !fir.complex<8>
211  %6 = fir.insert_value %5, %4, [0 : index] : (!fir.complex<8>, f64) -> !fir.complex<8>
212  %7 = fir.insert_value %6, %cst, [1 : index] : (!fir.complex<8>, f64) -> !fir.complex<8>
213  fir.store %7 to %0 : !fir.ref<!fir.complex<8>>
214  %8 = fir.load %0 : !fir.ref<!fir.complex<8>>
215  return %8 : !fir.complex<8>
216}
217func.func private @fabsf(f32) -> f32
218func.func private @fabs(f64) -> f64
219func.func private @llvm.fabs.f128(f128) -> f128
220func.func private @hypotf(f32, f32) -> f32
221func.func private @hypot(f64, f64) -> f64
222
223//--- aint_fast.fir
224// RUN: fir-opt %t/aint_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/aint_fast.fir
225// CHECK: @_QPtest_real4
226// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.trunc.f32({{%[A-Za-z0-9._]+}}) : (f32) -> f32
227
228// CHECK: @_QPtest_real8
229// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.trunc.f64({{%[A-Za-z0-9._]+}}) : (f64) -> f64
230
231func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
232  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
233  %1 = fir.load %arg0 : !fir.ref<f32>
234  %2 = fir.call @llvm.trunc.f32(%1) : (f32) -> f32
235  fir.store %2 to %0 : !fir.ref<f32>
236  %3 = fir.load %0 : !fir.ref<f32>
237  return %3 : f32
238}
239func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
240  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
241  %1 = fir.load %arg0 : !fir.ref<f64>
242  %2 = fir.call @llvm.trunc.f64(%1) : (f64) -> f64
243  fir.store %2 to %0 : !fir.ref<f64>
244  %3 = fir.load %0 : !fir.ref<f64>
245  return %3 : f64
246}
247func.func private @llvm.trunc.f32(f32) -> f32
248func.func private @llvm.trunc.f64(f64) -> f64
249
250//--- aint_relaxed.fir
251// RUN: fir-opt %t/aint_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/aint_relaxed.fir
252// CHECK: @_QPtest_real4
253// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.trunc.f32({{%[A-Za-z0-9._]+}}) : (f32) -> f32
254
255// CHECK: @_QPtest_real8
256// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.trunc.f64({{%[A-Za-z0-9._]+}}) : (f64) -> f64
257
258func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
259  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
260  %1 = fir.load %arg0 : !fir.ref<f32>
261  %2 = fir.call @llvm.trunc.f32(%1) : (f32) -> f32
262  fir.store %2 to %0 : !fir.ref<f32>
263  %3 = fir.load %0 : !fir.ref<f32>
264  return %3 : f32
265}
266func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
267  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
268  %1 = fir.load %arg0 : !fir.ref<f64>
269  %2 = fir.call @llvm.trunc.f64(%1) : (f64) -> f64
270  fir.store %2 to %0 : !fir.ref<f64>
271  %3 = fir.load %0 : !fir.ref<f64>
272  return %3 : f64
273}
274func.func private @llvm.trunc.f32(f32) -> f32
275func.func private @llvm.trunc.f64(f64) -> f64
276
277//--- aint_precise.fir
278// RUN: fir-opt %t/aint_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/aint_precise.fir
279// CHECK: @_QPtest_real4
280// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.trunc.f32({{%[A-Za-z0-9._]+}}) : (f32) -> f32
281
282// CHECK: @_QPtest_real8
283// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.trunc.f64({{%[A-Za-z0-9._]+}}) : (f64) -> f64
284
285func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
286  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
287  %1 = fir.load %arg0 : !fir.ref<f32>
288  %2 = fir.call @llvm.trunc.f32(%1) : (f32) -> f32
289  fir.store %2 to %0 : !fir.ref<f32>
290  %3 = fir.load %0 : !fir.ref<f32>
291  return %3 : f32
292}
293func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
294  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
295  %1 = fir.load %arg0 : !fir.ref<f64>
296  %2 = fir.call @llvm.trunc.f64(%1) : (f64) -> f64
297  fir.store %2 to %0 : !fir.ref<f64>
298  %3 = fir.load %0 : !fir.ref<f64>
299  return %3 : f64
300}
301func.func private @llvm.trunc.f32(f32) -> f32
302func.func private @llvm.trunc.f64(f64) -> f64
303
304//--- anint_fast.fir
305// RUN: fir-opt %t/anint_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/anint_fast.fir
306// CHECK: @_QPtest_real4
307// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.round"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
308
309// CHECK: @_QPtest_real8
310// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.round"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
311
312func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
313  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
314  %1 = fir.load %arg0 : !fir.ref<f32>
315  %2 = "llvm.intr.round"(%1) : (f32) -> f32
316  fir.store %2 to %0 : !fir.ref<f32>
317  %3 = fir.load %0 : !fir.ref<f32>
318  return %3 : f32
319}
320func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
321  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
322  %1 = fir.load %arg0 : !fir.ref<f64>
323  %2 = "llvm.intr.round"(%1) : (f64) -> f64
324  fir.store %2 to %0 : !fir.ref<f64>
325  %3 = fir.load %0 : !fir.ref<f64>
326  return %3 : f64
327}
328
329//--- anint_relaxed.fir
330// RUN: fir-opt %t/anint_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/anint_relaxed.fir
331// CHECK: @_QPtest_real4
332// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.round"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
333
334// CHECK: @_QPtest_real8
335// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.round"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
336
337func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
338  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
339  %1 = fir.load %arg0 : !fir.ref<f32>
340  %2 = "llvm.intr.round"(%1) : (f32) -> f32
341  fir.store %2 to %0 : !fir.ref<f32>
342  %3 = fir.load %0 : !fir.ref<f32>
343  return %3 : f32
344}
345func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
346  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
347  %1 = fir.load %arg0 : !fir.ref<f64>
348  %2 = "llvm.intr.round"(%1) : (f64) -> f64
349  fir.store %2 to %0 : !fir.ref<f64>
350  %3 = fir.load %0 : !fir.ref<f64>
351  return %3 : f64
352}
353
354//--- anint_precise.fir
355// RUN: fir-opt %t/anint_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/anint_precise.fir
356// CHECK: @_QPtest_real4
357// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.round.f32({{%[A-Za-z0-9._]+}}) : (f32) -> f32
358
359// CHECK: @_QPtest_real8
360// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.round.f64({{%[A-Za-z0-9._]+}}) : (f64) -> f64
361
362func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
363  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
364  %1 = fir.load %arg0 : !fir.ref<f32>
365  %2 = fir.call @llvm.round.f32(%1) : (f32) -> f32
366  fir.store %2 to %0 : !fir.ref<f32>
367  %3 = fir.load %0 : !fir.ref<f32>
368  return %3 : f32
369}
370func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
371  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
372  %1 = fir.load %arg0 : !fir.ref<f64>
373  %2 = fir.call @llvm.round.f64(%1) : (f64) -> f64
374  fir.store %2 to %0 : !fir.ref<f64>
375  %3 = fir.load %0 : !fir.ref<f64>
376  return %3 : f64
377}
378func.func private @llvm.round.f32(f32) -> f32
379func.func private @llvm.round.f64(f64) -> f64
380
381//--- atan_fast.fir
382// RUN: fir-opt %t/atan_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan_fast.fir
383// CHECK: @_QPtest_real4
384// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
385
386// CHECK: @_QPtest_real8
387// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
388
389func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
390  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
391  %1 = fir.load %arg0 : !fir.ref<f32>
392  %2 = math.atan %1 : f32
393  fir.store %2 to %0 : !fir.ref<f32>
394  %3 = fir.load %0 : !fir.ref<f32>
395  return %3 : f32
396}
397func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
398  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
399  %1 = fir.load %arg0 : !fir.ref<f64>
400  %2 = math.atan %1 : f64
401  fir.store %2 to %0 : !fir.ref<f64>
402  %3 = fir.load %0 : !fir.ref<f64>
403  return %3 : f64
404}
405
406//--- atan_relaxed.fir
407// RUN: fir-opt %t/atan_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan_relaxed.fir
408// CHECK: @_QPtest_real4
409// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
410
411// CHECK: @_QPtest_real8
412// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
413
414func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
415  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
416  %1 = fir.load %arg0 : !fir.ref<f32>
417  %2 = math.atan %1 : f32
418  fir.store %2 to %0 : !fir.ref<f32>
419  %3 = fir.load %0 : !fir.ref<f32>
420  return %3 : f32
421}
422func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
423  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
424  %1 = fir.load %arg0 : !fir.ref<f64>
425  %2 = math.atan %1 : f64
426  fir.store %2 to %0 : !fir.ref<f64>
427  %3 = fir.load %0 : !fir.ref<f64>
428  return %3 : f64
429}
430
431//--- atan_precise.fir
432// RUN: fir-opt %t/atan_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan_precise.fir
433// CHECK: @_QPtest_real4
434// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
435
436// CHECK: @_QPtest_real8
437// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
438
439func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
440  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
441  %1 = fir.load %arg0 : !fir.ref<f32>
442  %2 = fir.call @atanf(%1) : (f32) -> f32
443  fir.store %2 to %0 : !fir.ref<f32>
444  %3 = fir.load %0 : !fir.ref<f32>
445  return %3 : f32
446}
447func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
448  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
449  %1 = fir.load %arg0 : !fir.ref<f64>
450  %2 = fir.call @atan(%1) : (f64) -> f64
451  fir.store %2 to %0 : !fir.ref<f64>
452  %3 = fir.load %0 : !fir.ref<f64>
453  return %3 : f64
454}
455func.func private @atanf(f32) -> f32
456func.func private @atan(f64) -> f64
457
458//--- atan2_fast.fir
459// RUN: fir-opt %t/atan2_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan2_fast.fir
460// CHECK: @_QPtest_real4
461// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2f({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
462
463// CHECK: @_QPtest_real8
464// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
465
466func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
467  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
468  %1 = fir.load %arg0 : !fir.ref<f32>
469  %2 = fir.load %arg1 : !fir.ref<f32>
470  %3 = math.atan2 %1, %2 : f32
471  fir.store %3 to %0 : !fir.ref<f32>
472  %4 = fir.load %0 : !fir.ref<f32>
473  return %4 : f32
474}
475func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
476  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
477  %1 = fir.load %arg0 : !fir.ref<f64>
478  %2 = fir.load %arg1 : !fir.ref<f64>
479  %3 = math.atan2 %1, %2 : f64
480  fir.store %3 to %0 : !fir.ref<f64>
481  %4 = fir.load %0 : !fir.ref<f64>
482  return %4 : f64
483}
484
485//--- atan2_relaxed.fir
486// RUN: fir-opt %t/atan2_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan2_relaxed.fir
487// CHECK: @_QPtest_real4
488// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2f({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
489
490// CHECK: @_QPtest_real8
491// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
492
493func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
494  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
495  %1 = fir.load %arg0 : !fir.ref<f32>
496  %2 = fir.load %arg1 : !fir.ref<f32>
497  %3 = math.atan2 %1, %2 : f32
498  fir.store %3 to %0 : !fir.ref<f32>
499  %4 = fir.load %0 : !fir.ref<f32>
500  return %4 : f32
501}
502func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
503  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
504  %1 = fir.load %arg0 : !fir.ref<f64>
505  %2 = fir.load %arg1 : !fir.ref<f64>
506  %3 = math.atan2 %1, %2 : f64
507  fir.store %3 to %0 : !fir.ref<f64>
508  %4 = fir.load %0 : !fir.ref<f64>
509  return %4 : f64
510}
511
512//--- atan2_precise.fir
513// RUN: fir-opt %t/atan2_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan2_precise.fir
514// CHECK: @_QPtest_real4
515// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2f({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
516
517// CHECK: @_QPtest_real8
518// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
519
520func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
521  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
522  %1 = fir.load %arg0 : !fir.ref<f32>
523  %2 = fir.load %arg1 : !fir.ref<f32>
524  %3 = fir.call @atan2f(%1, %2) : (f32, f32) -> f32
525  fir.store %3 to %0 : !fir.ref<f32>
526  %4 = fir.load %0 : !fir.ref<f32>
527  return %4 : f32
528}
529func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
530  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
531  %1 = fir.load %arg0 : !fir.ref<f64>
532  %2 = fir.load %arg1 : !fir.ref<f64>
533  %3 = fir.call @atan2(%1, %2) : (f64, f64) -> f64
534  fir.store %3 to %0 : !fir.ref<f64>
535  %4 = fir.load %0 : !fir.ref<f64>
536  return %4 : f64
537}
538func.func private @atan2f(f32, f32) -> f32
539func.func private @atan2(f64, f64) -> f64
540
541//--- ceiling_fast.fir
542// RUN: fir-opt %t/ceiling_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/ceiling_fast.fir
543// CHECK: @_QPtest_real4
544// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.ceil"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
545
546// CHECK: @_QPtest_real8
547// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.ceil"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
548
549func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
550  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
551  %1 = fir.load %arg0 : !fir.ref<f32>
552  %2 = math.ceil %1 : f32
553  %3 = fir.convert %2 : (f32) -> i32
554  %4 = fir.convert %3 : (i32) -> f32
555  fir.store %4 to %0 : !fir.ref<f32>
556  %5 = fir.load %0 : !fir.ref<f32>
557  return %5 : f32
558}
559func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
560  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
561  %1 = fir.load %arg0 : !fir.ref<f64>
562  %2 = math.ceil %1 : f64
563  %3 = fir.convert %2 : (f64) -> i32
564  %4 = fir.convert %3 : (i32) -> f64
565  fir.store %4 to %0 : !fir.ref<f64>
566  %5 = fir.load %0 : !fir.ref<f64>
567  return %5 : f64
568}
569
570//--- ceiling_relaxed.fir
571// RUN: fir-opt %t/ceiling_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/ceiling_relaxed.fir
572// CHECK: @_QPtest_real4
573// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.ceil"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
574
575// CHECK: @_QPtest_real8
576// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.ceil"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
577
578func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
579  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
580  %1 = fir.load %arg0 : !fir.ref<f32>
581  %2 = math.ceil %1 : f32
582  %3 = fir.convert %2 : (f32) -> i32
583  %4 = fir.convert %3 : (i32) -> f32
584  fir.store %4 to %0 : !fir.ref<f32>
585  %5 = fir.load %0 : !fir.ref<f32>
586  return %5 : f32
587}
588func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
589  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
590  %1 = fir.load %arg0 : !fir.ref<f64>
591  %2 = math.ceil %1 : f64
592  %3 = fir.convert %2 : (f64) -> i32
593  %4 = fir.convert %3 : (i32) -> f64
594  fir.store %4 to %0 : !fir.ref<f64>
595  %5 = fir.load %0 : !fir.ref<f64>
596  return %5 : f64
597}
598
599//--- ceiling_precise.fir
600// RUN: fir-opt %t/ceiling_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/ceiling_precise.fir
601// CHECK: @_QPtest_real4
602// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @ceilf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
603
604// CHECK: @_QPtest_real8
605// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @ceil({{%[A-Za-z0-9._]+}}) : (f64) -> f64
606
607func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
608  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
609  %1 = fir.load %arg0 : !fir.ref<f32>
610  %2 = fir.call @ceilf(%1) : (f32) -> f32
611  %3 = fir.convert %2 : (f32) -> i32
612  %4 = fir.convert %3 : (i32) -> f32
613  fir.store %4 to %0 : !fir.ref<f32>
614  %5 = fir.load %0 : !fir.ref<f32>
615  return %5 : f32
616}
617func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
618  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
619  %1 = fir.load %arg0 : !fir.ref<f64>
620  %2 = fir.call @ceil(%1) : (f64) -> f64
621  %3 = fir.convert %2 : (f64) -> i32
622  %4 = fir.convert %3 : (i32) -> f64
623  fir.store %4 to %0 : !fir.ref<f64>
624  %5 = fir.load %0 : !fir.ref<f64>
625  return %5 : f64
626}
627func.func private @ceilf(f32) -> f32
628func.func private @ceil(f64) -> f64
629
630//--- cos_fast.fir
631// RUN: fir-opt %t/cos_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/cos_fast.fir
632// CHECK: @_QPtest_real4
633// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.cos"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
634
635// CHECK: @_QPtest_real8
636// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.cos"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
637
638func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
639  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
640  %1 = fir.load %arg0 : !fir.ref<f32>
641  %2 = math.cos %1 : f32
642  fir.store %2 to %0 : !fir.ref<f32>
643  %3 = fir.load %0 : !fir.ref<f32>
644  return %3 : f32
645}
646func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
647  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
648  %1 = fir.load %arg0 : !fir.ref<f64>
649  %2 = math.cos %1 : f64
650  fir.store %2 to %0 : !fir.ref<f64>
651  %3 = fir.load %0 : !fir.ref<f64>
652  return %3 : f64
653}
654
655//--- cos_relaxed.fir
656// RUN: fir-opt %t/cos_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/cos_relaxed.fir
657// CHECK: @_QPtest_real4
658// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.cos"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
659
660// CHECK: @_QPtest_real8
661// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.cos"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
662
663func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
664  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
665  %1 = fir.load %arg0 : !fir.ref<f32>
666  %2 = math.cos %1 : f32
667  fir.store %2 to %0 : !fir.ref<f32>
668  %3 = fir.load %0 : !fir.ref<f32>
669  return %3 : f32
670}
671func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
672  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
673  %1 = fir.load %arg0 : !fir.ref<f64>
674  %2 = math.cos %1 : f64
675  fir.store %2 to %0 : !fir.ref<f64>
676  %3 = fir.load %0 : !fir.ref<f64>
677  return %3 : f64
678}
679
680//--- cos_precise.fir
681// RUN: fir-opt %t/cos_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/cos_precise.fir
682// CHECK: @_QPtest_real4
683// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @cosf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
684
685// CHECK: @_QPtest_real8
686// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @cos({{%[A-Za-z0-9._]+}}) : (f64) -> f64
687
688func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
689  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
690  %1 = fir.load %arg0 : !fir.ref<f32>
691  %2 = fir.call @cosf(%1) : (f32) -> f32
692  fir.store %2 to %0 : !fir.ref<f32>
693  %3 = fir.load %0 : !fir.ref<f32>
694  return %3 : f32
695}
696func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
697  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
698  %1 = fir.load %arg0 : !fir.ref<f64>
699  %2 = fir.call @cos(%1) : (f64) -> f64
700  fir.store %2 to %0 : !fir.ref<f64>
701  %3 = fir.load %0 : !fir.ref<f64>
702  return %3 : f64
703}
704func.func private @cosf(f32) -> f32
705func.func private @cos(f64) -> f64
706
707//--- cosh_fast.fir
708// RUN: fir-opt %t/cosh_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/cosh_fast.fir
709// CHECK: @_QPtest_real4
710// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @coshf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
711
712// CHECK: @_QPtest_real8
713// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @cosh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
714
715func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
716  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
717  %1 = fir.load %arg0 : !fir.ref<f32>
718  %2 = fir.call @coshf(%1) : (f32) -> f32
719  fir.store %2 to %0 : !fir.ref<f32>
720  %3 = fir.load %0 : !fir.ref<f32>
721  return %3 : f32
722}
723func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
724  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
725  %1 = fir.load %arg0 : !fir.ref<f64>
726  %2 = fir.call @cosh(%1) : (f64) -> f64
727  fir.store %2 to %0 : !fir.ref<f64>
728  %3 = fir.load %0 : !fir.ref<f64>
729  return %3 : f64
730}
731func.func private @coshf(f32) -> f32
732func.func private @cosh(f64) -> f64
733
734//--- cosh_relaxed.fir
735// RUN: fir-opt %t/cosh_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/cosh_relaxed.fir
736// CHECK: @_QPtest_real4
737// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @coshf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
738
739// CHECK: @_QPtest_real8
740// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @cosh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
741
742func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
743  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
744  %1 = fir.load %arg0 : !fir.ref<f32>
745  %2 = fir.call @coshf(%1) : (f32) -> f32
746  fir.store %2 to %0 : !fir.ref<f32>
747  %3 = fir.load %0 : !fir.ref<f32>
748  return %3 : f32
749}
750func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
751  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
752  %1 = fir.load %arg0 : !fir.ref<f64>
753  %2 = fir.call @cosh(%1) : (f64) -> f64
754  fir.store %2 to %0 : !fir.ref<f64>
755  %3 = fir.load %0 : !fir.ref<f64>
756  return %3 : f64
757}
758func.func private @coshf(f32) -> f32
759func.func private @cosh(f64) -> f64
760
761//--- cosh_precise.fir
762// RUN: fir-opt %t/cosh_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/cosh_precise.fir
763// CHECK: @_QPtest_real4
764// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @coshf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
765
766// CHECK: @_QPtest_real8
767// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @cosh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
768
769func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
770  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
771  %1 = fir.load %arg0 : !fir.ref<f32>
772  %2 = fir.call @coshf(%1) : (f32) -> f32
773  fir.store %2 to %0 : !fir.ref<f32>
774  %3 = fir.load %0 : !fir.ref<f32>
775  return %3 : f32
776}
777func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
778  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
779  %1 = fir.load %arg0 : !fir.ref<f64>
780  %2 = fir.call @cosh(%1) : (f64) -> f64
781  fir.store %2 to %0 : !fir.ref<f64>
782  %3 = fir.load %0 : !fir.ref<f64>
783  return %3 : f64
784}
785func.func private @coshf(f32) -> f32
786func.func private @cosh(f64) -> f64
787
788//--- erf_fast.fir
789// RUN: fir-opt %t/erf_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/erf_fast.fir
790// CHECK: @_QPtest_real4
791// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @erff({{%[A-Za-z0-9._]+}}) : (f32) -> f32
792
793// CHECK: @_QPtest_real8
794// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @erf({{%[A-Za-z0-9._]+}}) : (f64) -> f64
795
796func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
797  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
798  %1 = fir.load %arg0 : !fir.ref<f32>
799  %2 = math.erf %1 : f32
800  fir.store %2 to %0 : !fir.ref<f32>
801  %3 = fir.load %0 : !fir.ref<f32>
802  return %3 : f32
803}
804func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
805  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
806  %1 = fir.load %arg0 : !fir.ref<f64>
807  %2 = math.erf %1 : f64
808  fir.store %2 to %0 : !fir.ref<f64>
809  %3 = fir.load %0 : !fir.ref<f64>
810  return %3 : f64
811}
812
813//--- erf_relaxed.fir
814// RUN: fir-opt %t/erf_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/erf_relaxed.fir
815// CHECK: @_QPtest_real4
816// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @erff({{%[A-Za-z0-9._]+}}) : (f32) -> f32
817
818// CHECK: @_QPtest_real8
819// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @erf({{%[A-Za-z0-9._]+}}) : (f64) -> f64
820
821func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
822  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
823  %1 = fir.load %arg0 : !fir.ref<f32>
824  %2 = math.erf %1 : f32
825  fir.store %2 to %0 : !fir.ref<f32>
826  %3 = fir.load %0 : !fir.ref<f32>
827  return %3 : f32
828}
829func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
830  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
831  %1 = fir.load %arg0 : !fir.ref<f64>
832  %2 = math.erf %1 : f64
833  fir.store %2 to %0 : !fir.ref<f64>
834  %3 = fir.load %0 : !fir.ref<f64>
835  return %3 : f64
836}
837
838//--- erf_precise.fir
839// RUN: fir-opt %t/erf_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/erf_precise.fir
840// CHECK: @_QPtest_real4
841// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @erff({{%[A-Za-z0-9._]+}}) : (f32) -> f32
842
843// CHECK: @_QPtest_real8
844// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @erf({{%[A-Za-z0-9._]+}}) : (f64) -> f64
845
846func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
847  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
848  %1 = fir.load %arg0 : !fir.ref<f32>
849  %2 = fir.call @erff(%1) : (f32) -> f32
850  fir.store %2 to %0 : !fir.ref<f32>
851  %3 = fir.load %0 : !fir.ref<f32>
852  return %3 : f32
853}
854func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
855  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
856  %1 = fir.load %arg0 : !fir.ref<f64>
857  %2 = fir.call @erf(%1) : (f64) -> f64
858  fir.store %2 to %0 : !fir.ref<f64>
859  %3 = fir.load %0 : !fir.ref<f64>
860  return %3 : f64
861}
862func.func private @erff(f32) -> f32
863func.func private @erf(f64) -> f64
864
865//--- exp_fast.fir
866// RUN: fir-opt %t/exp_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/exp_fast.fir
867// CHECK: @_QPtest_real4
868// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.exp"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
869
870// CHECK: @_QPtest_real8
871// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.exp"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
872
873func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
874  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
875  %1 = fir.load %arg0 : !fir.ref<f32>
876  %2 = math.exp %1 : f32
877  fir.store %2 to %0 : !fir.ref<f32>
878  %3 = fir.load %0 : !fir.ref<f32>
879  return %3 : f32
880}
881func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
882  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
883  %1 = fir.load %arg0 : !fir.ref<f64>
884  %2 = math.exp %1 : f64
885  fir.store %2 to %0 : !fir.ref<f64>
886  %3 = fir.load %0 : !fir.ref<f64>
887  return %3 : f64
888}
889
890//--- exp_relaxed.fir
891// RUN: fir-opt %t/exp_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/exp_relaxed.fir
892// CHECK: @_QPtest_real4
893// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.exp"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
894
895// CHECK: @_QPtest_real8
896// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.exp"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
897
898func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
899  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
900  %1 = fir.load %arg0 : !fir.ref<f32>
901  %2 = math.exp %1 : f32
902  fir.store %2 to %0 : !fir.ref<f32>
903  %3 = fir.load %0 : !fir.ref<f32>
904  return %3 : f32
905}
906func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
907  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
908  %1 = fir.load %arg0 : !fir.ref<f64>
909  %2 = math.exp %1 : f64
910  fir.store %2 to %0 : !fir.ref<f64>
911  %3 = fir.load %0 : !fir.ref<f64>
912  return %3 : f64
913}
914
915//--- exp_precise.fir
916// RUN: fir-opt %t/exp_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/exp_precise.fir
917// CHECK: @_QPtest_real4
918// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @expf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
919
920// CHECK: @_QPtest_real8
921// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @exp({{%[A-Za-z0-9._]+}}) : (f64) -> f64
922
923func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
924  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
925  %1 = fir.load %arg0 : !fir.ref<f32>
926  %2 = fir.call @expf(%1) : (f32) -> f32
927  fir.store %2 to %0 : !fir.ref<f32>
928  %3 = fir.load %0 : !fir.ref<f32>
929  return %3 : f32
930}
931func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
932  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
933  %1 = fir.load %arg0 : !fir.ref<f64>
934  %2 = fir.call @exp(%1) : (f64) -> f64
935  fir.store %2 to %0 : !fir.ref<f64>
936  %3 = fir.load %0 : !fir.ref<f64>
937  return %3 : f64
938}
939func.func private @expf(f32) -> f32
940func.func private @exp(f64) -> f64
941
942//--- floor_fast.fir
943// RUN: fir-opt %t/floor_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/floor_fast.fir
944// CHECK: @_QPtest_real4
945// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.floor"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
946
947// CHECK: @_QPtest_real8
948// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.floor"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
949
950func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
951  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
952  %1 = fir.load %arg0 : !fir.ref<f32>
953  %2 = math.floor %1 : f32
954  %3 = fir.convert %2 : (f32) -> i32
955  %4 = fir.convert %3 : (i32) -> f32
956  fir.store %4 to %0 : !fir.ref<f32>
957  %5 = fir.load %0 : !fir.ref<f32>
958  return %5 : f32
959}
960func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
961  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
962  %1 = fir.load %arg0 : !fir.ref<f64>
963  %2 = math.floor %1 : f64
964  %3 = fir.convert %2 : (f64) -> i32
965  %4 = fir.convert %3 : (i32) -> f64
966  fir.store %4 to %0 : !fir.ref<f64>
967  %5 = fir.load %0 : !fir.ref<f64>
968  return %5 : f64
969}
970
971//--- floor_relaxed.fir
972// RUN: fir-opt %t/floor_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/floor_relaxed.fir
973// CHECK: @_QPtest_real4
974// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.floor"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
975
976// CHECK: @_QPtest_real8
977// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.floor"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
978
979func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
980  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
981  %1 = fir.load %arg0 : !fir.ref<f32>
982  %2 = math.floor %1 : f32
983  %3 = fir.convert %2 : (f32) -> i32
984  %4 = fir.convert %3 : (i32) -> f32
985  fir.store %4 to %0 : !fir.ref<f32>
986  %5 = fir.load %0 : !fir.ref<f32>
987  return %5 : f32
988}
989func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
990  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
991  %1 = fir.load %arg0 : !fir.ref<f64>
992  %2 = math.floor %1 : f64
993  %3 = fir.convert %2 : (f64) -> i32
994  %4 = fir.convert %3 : (i32) -> f64
995  fir.store %4 to %0 : !fir.ref<f64>
996  %5 = fir.load %0 : !fir.ref<f64>
997  return %5 : f64
998}
999
1000//--- floor_precise.fir
1001// RUN: fir-opt %t/floor_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/floor_precise.fir
1002// CHECK: @_QPtest_real4
1003// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @floorf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1004
1005// CHECK: @_QPtest_real8
1006// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @floor({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1007
1008func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1009  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1010  %1 = fir.load %arg0 : !fir.ref<f32>
1011  %2 = fir.call @floorf(%1) : (f32) -> f32
1012  %3 = fir.convert %2 : (f32) -> i32
1013  %4 = fir.convert %3 : (i32) -> f32
1014  fir.store %4 to %0 : !fir.ref<f32>
1015  %5 = fir.load %0 : !fir.ref<f32>
1016  return %5 : f32
1017}
1018func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1019  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1020  %1 = fir.load %arg0 : !fir.ref<f64>
1021  %2 = fir.call @floor(%1) : (f64) -> f64
1022  %3 = fir.convert %2 : (f64) -> i32
1023  %4 = fir.convert %3 : (i32) -> f64
1024  fir.store %4 to %0 : !fir.ref<f64>
1025  %5 = fir.load %0 : !fir.ref<f64>
1026  return %5 : f64
1027}
1028func.func private @floorf(f32) -> f32
1029func.func private @floor(f64) -> f64
1030
1031//--- log_fast.fir
1032// RUN: fir-opt %t/log_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/log_fast.fir
1033// CHECK: @_QPtest_real4
1034// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.log"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1035
1036// CHECK: @_QPtest_real8
1037// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.log"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1038
1039func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1040  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1041  %1 = fir.load %arg0 : !fir.ref<f32>
1042  %2 = math.log %1 : f32
1043  fir.store %2 to %0 : !fir.ref<f32>
1044  %3 = fir.load %0 : !fir.ref<f32>
1045  return %3 : f32
1046}
1047func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1048  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1049  %1 = fir.load %arg0 : !fir.ref<f64>
1050  %2 = math.log %1 : f64
1051  fir.store %2 to %0 : !fir.ref<f64>
1052  %3 = fir.load %0 : !fir.ref<f64>
1053  return %3 : f64
1054}
1055
1056//--- log_relaxed.fir
1057// RUN: fir-opt %t/log_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/log_relaxed.fir
1058// CHECK: @_QPtest_real4
1059// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.log"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1060
1061// CHECK: @_QPtest_real8
1062// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.log"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1063
1064func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1065  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1066  %1 = fir.load %arg0 : !fir.ref<f32>
1067  %2 = math.log %1 : f32
1068  fir.store %2 to %0 : !fir.ref<f32>
1069  %3 = fir.load %0 : !fir.ref<f32>
1070  return %3 : f32
1071}
1072func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1073  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1074  %1 = fir.load %arg0 : !fir.ref<f64>
1075  %2 = math.log %1 : f64
1076  fir.store %2 to %0 : !fir.ref<f64>
1077  %3 = fir.load %0 : !fir.ref<f64>
1078  return %3 : f64
1079}
1080
1081//--- log_precise.fir
1082// RUN: fir-opt %t/log_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/log_precise.fir
1083// CHECK: @_QPtest_real4
1084// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @logf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1085
1086// CHECK: @_QPtest_real8
1087// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @log({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1088
1089func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1090  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1091  %1 = fir.load %arg0 : !fir.ref<f32>
1092  %2 = fir.call @logf(%1) : (f32) -> f32
1093  fir.store %2 to %0 : !fir.ref<f32>
1094  %3 = fir.load %0 : !fir.ref<f32>
1095  return %3 : f32
1096}
1097func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1098  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1099  %1 = fir.load %arg0 : !fir.ref<f64>
1100  %2 = fir.call @log(%1) : (f64) -> f64
1101  fir.store %2 to %0 : !fir.ref<f64>
1102  %3 = fir.load %0 : !fir.ref<f64>
1103  return %3 : f64
1104}
1105func.func private @logf(f32) -> f32
1106func.func private @log(f64) -> f64
1107
1108//--- log10_fast.fir
1109// RUN: fir-opt %t/log10_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/log10_fast.fir
1110// CHECK: @_QPtest_real4
1111// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.log10"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1112
1113// CHECK: @_QPtest_real8
1114// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.log10"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1115
1116func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1117  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1118  %1 = fir.load %arg0 : !fir.ref<f32>
1119  %2 = math.log10 %1 : f32
1120  fir.store %2 to %0 : !fir.ref<f32>
1121  %3 = fir.load %0 : !fir.ref<f32>
1122  return %3 : f32
1123}
1124func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1125  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1126  %1 = fir.load %arg0 : !fir.ref<f64>
1127  %2 = math.log10 %1 : f64
1128  fir.store %2 to %0 : !fir.ref<f64>
1129  %3 = fir.load %0 : !fir.ref<f64>
1130  return %3 : f64
1131}
1132
1133//--- log10_relaxed.fir
1134// RUN: fir-opt %t/log10_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/log10_relaxed.fir
1135// CHECK: @_QPtest_real4
1136// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.log10"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1137
1138// CHECK: @_QPtest_real8
1139// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.log10"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1140
1141func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1142  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1143  %1 = fir.load %arg0 : !fir.ref<f32>
1144  %2 = math.log10 %1 : f32
1145  fir.store %2 to %0 : !fir.ref<f32>
1146  %3 = fir.load %0 : !fir.ref<f32>
1147  return %3 : f32
1148}
1149func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1150  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1151  %1 = fir.load %arg0 : !fir.ref<f64>
1152  %2 = math.log10 %1 : f64
1153  fir.store %2 to %0 : !fir.ref<f64>
1154  %3 = fir.load %0 : !fir.ref<f64>
1155  return %3 : f64
1156}
1157
1158//--- log10_precise.fir
1159// RUN: fir-opt %t/log10_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/log10_precise.fir
1160// CHECK: @_QPtest_real4
1161// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @log10f({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1162
1163// CHECK: @_QPtest_real8
1164// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @log10({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1165
1166func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1167  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1168  %1 = fir.load %arg0 : !fir.ref<f32>
1169  %2 = fir.call @log10f(%1) : (f32) -> f32
1170  fir.store %2 to %0 : !fir.ref<f32>
1171  %3 = fir.load %0 : !fir.ref<f32>
1172  return %3 : f32
1173}
1174func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1175  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1176  %1 = fir.load %arg0 : !fir.ref<f64>
1177  %2 = fir.call @log10(%1) : (f64) -> f64
1178  fir.store %2 to %0 : !fir.ref<f64>
1179  %3 = fir.load %0 : !fir.ref<f64>
1180  return %3 : f64
1181}
1182func.func private @log10f(f32) -> f32
1183func.func private @log10(f64) -> f64
1184
1185//--- nint_fast.fir
1186// RUN: fir-opt %t/nint_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/nint_fast.fir
1187// CHECK: @_QPtest_real4
1188// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i32.f32({{%[A-Za-z0-9._]+}}) : (f32) -> i32
1189// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i64.f32({{%[A-Za-z0-9._]+}}) : (f32) -> i64
1190
1191// CHECK: @_QPtest_real8
1192// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i32.f64({{%[A-Za-z0-9._]+}}) : (f64) -> i32
1193// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i64.f64({{%[A-Za-z0-9._]+}}) : (f64) -> i64
1194
1195func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1196  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1197  %1 = fir.load %arg0 : !fir.ref<f32>
1198  %2 = fir.call @llvm.lround.i32.f32(%1) : (f32) -> i32
1199  %3 = fir.convert %2 : (i32) -> i64
1200  %4 = fir.load %arg0 : !fir.ref<f32>
1201  %5 = fir.call @llvm.lround.i64.f32(%4) : (f32) -> i64
1202  %6 = arith.addi %3, %5 : i64
1203  %7 = fir.convert %6 : (i64) -> f32
1204  fir.store %7 to %0 : !fir.ref<f32>
1205  %8 = fir.load %0 : !fir.ref<f32>
1206  return %8 : f32
1207}
1208func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1209  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1210  %1 = fir.load %arg0 : !fir.ref<f64>
1211  %2 = fir.call @llvm.lround.i32.f64(%1) : (f64) -> i32
1212  %3 = fir.convert %2 : (i32) -> i64
1213  %4 = fir.load %arg0 : !fir.ref<f64>
1214  %5 = fir.call @llvm.lround.i64.f64(%4) : (f64) -> i64
1215  %6 = arith.addi %3, %5 : i64
1216  %7 = fir.convert %6 : (i64) -> f64
1217  fir.store %7 to %0 : !fir.ref<f64>
1218  %8 = fir.load %0 : !fir.ref<f64>
1219  return %8 : f64
1220}
1221func.func private @llvm.lround.i32.f32(f32) -> i32
1222func.func private @llvm.lround.i64.f32(f32) -> i64
1223func.func private @llvm.lround.i32.f64(f64) -> i32
1224func.func private @llvm.lround.i64.f64(f64) -> i64
1225
1226//--- nint_relaxed.fir
1227// RUN: fir-opt %t/nint_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/nint_relaxed.fir
1228// CHECK: @_QPtest_real4
1229// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i32.f32({{%[A-Za-z0-9._]+}}) : (f32) -> i32
1230// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i64.f32({{%[A-Za-z0-9._]+}}) : (f32) -> i64
1231
1232// CHECK: @_QPtest_real8
1233// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i32.f64({{%[A-Za-z0-9._]+}}) : (f64) -> i32
1234// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i64.f64({{%[A-Za-z0-9._]+}}) : (f64) -> i64
1235
1236func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1237  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1238  %1 = fir.load %arg0 : !fir.ref<f32>
1239  %2 = fir.call @llvm.lround.i32.f32(%1) : (f32) -> i32
1240  %3 = fir.convert %2 : (i32) -> i64
1241  %4 = fir.load %arg0 : !fir.ref<f32>
1242  %5 = fir.call @llvm.lround.i64.f32(%4) : (f32) -> i64
1243  %6 = arith.addi %3, %5 : i64
1244  %7 = fir.convert %6 : (i64) -> f32
1245  fir.store %7 to %0 : !fir.ref<f32>
1246  %8 = fir.load %0 : !fir.ref<f32>
1247  return %8 : f32
1248}
1249func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1250  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1251  %1 = fir.load %arg0 : !fir.ref<f64>
1252  %2 = fir.call @llvm.lround.i32.f64(%1) : (f64) -> i32
1253  %3 = fir.convert %2 : (i32) -> i64
1254  %4 = fir.load %arg0 : !fir.ref<f64>
1255  %5 = fir.call @llvm.lround.i64.f64(%4) : (f64) -> i64
1256  %6 = arith.addi %3, %5 : i64
1257  %7 = fir.convert %6 : (i64) -> f64
1258  fir.store %7 to %0 : !fir.ref<f64>
1259  %8 = fir.load %0 : !fir.ref<f64>
1260  return %8 : f64
1261}
1262func.func private @llvm.lround.i32.f32(f32) -> i32
1263func.func private @llvm.lround.i64.f32(f32) -> i64
1264func.func private @llvm.lround.i32.f64(f64) -> i32
1265func.func private @llvm.lround.i64.f64(f64) -> i64
1266
1267//--- nint_precise.fir
1268// RUN: fir-opt %t/nint_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/nint_precise.fir
1269// CHECK: @_QPtest_real4
1270// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i32.f32({{%[A-Za-z0-9._]+}}) : (f32) -> i32
1271// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i64.f32({{%[A-Za-z0-9._]+}}) : (f32) -> i64
1272
1273// CHECK: @_QPtest_real8
1274// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i32.f64({{%[A-Za-z0-9._]+}}) : (f64) -> i32
1275// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.lround.i64.f64({{%[A-Za-z0-9._]+}}) : (f64) -> i64
1276
1277func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1278  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1279  %1 = fir.load %arg0 : !fir.ref<f32>
1280  %2 = fir.call @llvm.lround.i32.f32(%1) : (f32) -> i32
1281  %3 = fir.convert %2 : (i32) -> i64
1282  %4 = fir.load %arg0 : !fir.ref<f32>
1283  %5 = fir.call @llvm.lround.i64.f32(%4) : (f32) -> i64
1284  %6 = arith.addi %3, %5 : i64
1285  %7 = fir.convert %6 : (i64) -> f32
1286  fir.store %7 to %0 : !fir.ref<f32>
1287  %8 = fir.load %0 : !fir.ref<f32>
1288  return %8 : f32
1289}
1290func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1291  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1292  %1 = fir.load %arg0 : !fir.ref<f64>
1293  %2 = fir.call @llvm.lround.i32.f64(%1) : (f64) -> i32
1294  %3 = fir.convert %2 : (i32) -> i64
1295  %4 = fir.load %arg0 : !fir.ref<f64>
1296  %5 = fir.call @llvm.lround.i64.f64(%4) : (f64) -> i64
1297  %6 = arith.addi %3, %5 : i64
1298  %7 = fir.convert %6 : (i64) -> f64
1299  fir.store %7 to %0 : !fir.ref<f64>
1300  %8 = fir.load %0 : !fir.ref<f64>
1301  return %8 : f64
1302}
1303func.func private @llvm.lround.i32.f32(f32) -> i32
1304func.func private @llvm.lround.i64.f32(f32) -> i64
1305func.func private @llvm.lround.i32.f64(f64) -> i32
1306func.func private @llvm.lround.i64.f64(f64) -> i64
1307
1308//--- exponentiation_fast.fir
1309// RUN: fir-opt %t/exponentiation_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/exponentiation_fast.fir
1310// CHECK: @_QPtest_real4
1311// CHECK: [[STOI:%[A-Za-z0-9._]+]] = llvm.sext {{%[A-Za-z0-9._]+}} : i16 to i32
1312// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f32.i32({{%[A-Za-z0-9._]+}}, [[STOI]]) : (f32, i32) -> f32
1313// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.pow"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1314// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f32.i32({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, i32) -> f32
1315
1316// CHECK: @_QPtest_real8
1317// CHECK: [[STOI:%[A-Za-z0-9._]+]] = llvm.sext {{%[A-Za-z0-9._]+}} : i16 to i32
1318// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f64.i32({{%[A-Za-z0-9._]+}}, [[STOI]]) : (f64, i32) -> f64
1319// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.pow"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1320// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f64.i32({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, i32) -> f64
1321
1322func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}, %arg2: !fir.ref<i16> {fir.bindc_name = "s"}, %arg3: !fir.ref<i32> {fir.bindc_name = "i"}) -> f32 {
1323  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1324  %1 = fir.load %arg0 : !fir.ref<f32>
1325  %2 = fir.load %arg2 : !fir.ref<i16>
1326  %3 = fir.convert %2 : (i16) -> i32
1327  %4 = fir.call @llvm.powi.f32.i32(%1, %3) : (f32, i32) -> f32
1328  %5 = fir.load %arg0 : !fir.ref<f32>
1329  %6 = fir.load %arg1 : !fir.ref<f32>
1330  %7 = math.powf %5, %6 : f32
1331  %8 = arith.addf %4, %7 : f32
1332  %9 = fir.load %arg0 : !fir.ref<f32>
1333  %10 = fir.load %arg3 : !fir.ref<i32>
1334  %11 = fir.call @llvm.powi.f32.i32(%9, %10) : (f32, i32) -> f32
1335  %12 = arith.addf %8, %11 : f32
1336  fir.store %12 to %0 : !fir.ref<f32>
1337  %13 = fir.load %0 : !fir.ref<f32>
1338  return %13 : f32
1339}
1340func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}, %arg2: !fir.ref<i16> {fir.bindc_name = "s"}, %arg3: !fir.ref<i32> {fir.bindc_name = "i"}) -> f64 {
1341  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1342  %1 = fir.load %arg0 : !fir.ref<f64>
1343  %2 = fir.load %arg2 : !fir.ref<i16>
1344  %3 = fir.convert %2 : (i16) -> i32
1345  %4 = fir.call @llvm.powi.f64.i32(%1, %3) : (f64, i32) -> f64
1346  %5 = fir.load %arg0 : !fir.ref<f64>
1347  %6 = fir.load %arg1 : !fir.ref<f64>
1348  %7 = math.powf %5, %6 : f64
1349  %8 = arith.addf %4, %7 : f64
1350  %9 = fir.load %arg0 : !fir.ref<f64>
1351  %10 = fir.load %arg3 : !fir.ref<i32>
1352  %11 = fir.call @llvm.powi.f64.i32(%9, %10) : (f64, i32) -> f64
1353  %12 = arith.addf %8, %11 : f64
1354  fir.store %12 to %0 : !fir.ref<f64>
1355  %13 = fir.load %0 : !fir.ref<f64>
1356  return %13 : f64
1357}
1358func.func private @llvm.powi.f32.i32(f32, i32) -> f32
1359func.func private @llvm.powi.f64.i32(f64, i32) -> f64
1360
1361//--- exponentiation_relaxed.fir
1362// RUN: fir-opt %t/exponentiation_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/exponentiation_relaxed.fir
1363// CHECK: @_QPtest_real4
1364// CHECK: [[STOI:%[A-Za-z0-9._]+]] = llvm.sext {{%[A-Za-z0-9._]+}} : i16 to i32
1365// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f32.i32({{%[A-Za-z0-9._]+}}, [[STOI]]) : (f32, i32) -> f32
1366// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.pow"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1367// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f32.i32({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, i32) -> f32
1368
1369// CHECK: @_QPtest_real8
1370// CHECK: [[STOI:%[A-Za-z0-9._]+]] = llvm.sext {{%[A-Za-z0-9._]+}} : i16 to i32
1371// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f64.i32({{%[A-Za-z0-9._]+}}, [[STOI]]) : (f64, i32) -> f64
1372// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.pow"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1373// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f64.i32({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, i32) -> f64
1374
1375func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}, %arg2: !fir.ref<i16> {fir.bindc_name = "s"}, %arg3: !fir.ref<i32> {fir.bindc_name = "i"}) -> f32 {
1376  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1377  %1 = fir.load %arg0 : !fir.ref<f32>
1378  %2 = fir.load %arg2 : !fir.ref<i16>
1379  %3 = fir.convert %2 : (i16) -> i32
1380  %4 = fir.call @llvm.powi.f32.i32(%1, %3) : (f32, i32) -> f32
1381  %5 = fir.load %arg0 : !fir.ref<f32>
1382  %6 = fir.load %arg1 : !fir.ref<f32>
1383  %7 = math.powf %5, %6 : f32
1384  %8 = arith.addf %4, %7 : f32
1385  %9 = fir.load %arg0 : !fir.ref<f32>
1386  %10 = fir.load %arg3 : !fir.ref<i32>
1387  %11 = fir.call @llvm.powi.f32.i32(%9, %10) : (f32, i32) -> f32
1388  %12 = arith.addf %8, %11 : f32
1389  fir.store %12 to %0 : !fir.ref<f32>
1390  %13 = fir.load %0 : !fir.ref<f32>
1391  return %13 : f32
1392}
1393func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}, %arg2: !fir.ref<i16> {fir.bindc_name = "s"}, %arg3: !fir.ref<i32> {fir.bindc_name = "i"}) -> f64 {
1394  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1395  %1 = fir.load %arg0 : !fir.ref<f64>
1396  %2 = fir.load %arg2 : !fir.ref<i16>
1397  %3 = fir.convert %2 : (i16) -> i32
1398  %4 = fir.call @llvm.powi.f64.i32(%1, %3) : (f64, i32) -> f64
1399  %5 = fir.load %arg0 : !fir.ref<f64>
1400  %6 = fir.load %arg1 : !fir.ref<f64>
1401  %7 = math.powf %5, %6 : f64
1402  %8 = arith.addf %4, %7 : f64
1403  %9 = fir.load %arg0 : !fir.ref<f64>
1404  %10 = fir.load %arg3 : !fir.ref<i32>
1405  %11 = fir.call @llvm.powi.f64.i32(%9, %10) : (f64, i32) -> f64
1406  %12 = arith.addf %8, %11 : f64
1407  fir.store %12 to %0 : !fir.ref<f64>
1408  %13 = fir.load %0 : !fir.ref<f64>
1409  return %13 : f64
1410}
1411func.func private @llvm.powi.f32.i32(f32, i32) -> f32
1412func.func private @llvm.powi.f64.i32(f64, i32) -> f64
1413
1414//--- exponentiation_precise.fir
1415// RUN: fir-opt %t/exponentiation_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/exponentiation_precise.fir
1416// CHECK: @_QPtest_real4
1417// CHECK: [[STOI:%[A-Za-z0-9._]+]] = llvm.sext {{%[A-Za-z0-9._]+}} : i16 to i32
1418// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f32.i32({{%[A-Za-z0-9._]+}}, [[STOI]]) : (f32, i32) -> f32
1419// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @powf({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1420// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f32.i32({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, i32) -> f32
1421
1422// CHECK: @_QPtest_real8
1423// CHECK: [[STOI:%[A-Za-z0-9._]+]] = llvm.sext {{%[A-Za-z0-9._]+}} : i16 to i32
1424// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f64.i32({{%[A-Za-z0-9._]+}}, [[STOI]]) : (f64, i32) -> f64
1425// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @pow({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1426// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.powi.f64.i32({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, i32) -> f64
1427
1428func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}, %arg2: !fir.ref<i16> {fir.bindc_name = "s"}, %arg3: !fir.ref<i32> {fir.bindc_name = "i"}) -> f32 {
1429  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1430  %1 = fir.load %arg0 : !fir.ref<f32>
1431  %2 = fir.load %arg2 : !fir.ref<i16>
1432  %3 = fir.convert %2 : (i16) -> i32
1433  %4 = fir.call @llvm.powi.f32.i32(%1, %3) : (f32, i32) -> f32
1434  %5 = fir.load %arg0 : !fir.ref<f32>
1435  %6 = fir.load %arg1 : !fir.ref<f32>
1436  %7 = fir.call @powf(%5, %6) : (f32, f32) -> f32
1437  %8 = arith.addf %4, %7 : f32
1438  %9 = fir.load %arg0 : !fir.ref<f32>
1439  %10 = fir.load %arg3 : !fir.ref<i32>
1440  %11 = fir.call @llvm.powi.f32.i32(%9, %10) : (f32, i32) -> f32
1441  %12 = arith.addf %8, %11 : f32
1442  fir.store %12 to %0 : !fir.ref<f32>
1443  %13 = fir.load %0 : !fir.ref<f32>
1444  return %13 : f32
1445}
1446func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}, %arg2: !fir.ref<i16> {fir.bindc_name = "s"}, %arg3: !fir.ref<i32> {fir.bindc_name = "i"}) -> f64 {
1447  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1448  %1 = fir.load %arg0 : !fir.ref<f64>
1449  %2 = fir.load %arg2 : !fir.ref<i16>
1450  %3 = fir.convert %2 : (i16) -> i32
1451  %4 = fir.call @llvm.powi.f64.i32(%1, %3) : (f64, i32) -> f64
1452  %5 = fir.load %arg0 : !fir.ref<f64>
1453  %6 = fir.load %arg1 : !fir.ref<f64>
1454  %7 = fir.call @pow(%5, %6) : (f64, f64) -> f64
1455  %8 = arith.addf %4, %7 : f64
1456  %9 = fir.load %arg0 : !fir.ref<f64>
1457  %10 = fir.load %arg3 : !fir.ref<i32>
1458  %11 = fir.call @llvm.powi.f64.i32(%9, %10) : (f64, i32) -> f64
1459  %12 = arith.addf %8, %11 : f64
1460  fir.store %12 to %0 : !fir.ref<f64>
1461  %13 = fir.load %0 : !fir.ref<f64>
1462  return %13 : f64
1463}
1464func.func private @llvm.powi.f32.i32(f32, i32) -> f32
1465func.func private @powf(f32, f32) -> f32
1466func.func private @llvm.powi.f64.i32(f64, i32) -> f64
1467func.func private @pow(f64, f64) -> f64
1468
1469//--- sign_fast.fir
1470// RUN: fir-opt %t/sign_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sign_fast.fir
1471// CHECK: @_QPtest_real4
1472// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.copysign"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1473
1474// CHECK: @_QPtest_real8
1475// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.copysign"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1476
1477// CHECK: @_QPtest_real10
1478// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.copysign"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f80, f80) -> f80
1479
1480// CHECK: @_QPtest_real16
1481// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.copysign"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f128, f128) -> f128
1482
1483func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
1484  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1485  %1 = fir.load %arg0 : !fir.ref<f32>
1486  %2 = fir.load %arg1 : !fir.ref<f32>
1487  %3 = math.copysign %1, %2 : f32
1488  fir.store %3 to %0 : !fir.ref<f32>
1489  %4 = fir.load %0 : !fir.ref<f32>
1490  return %4 : f32
1491}
1492func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
1493  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1494  %1 = fir.load %arg0 : !fir.ref<f64>
1495  %2 = fir.load %arg1 : !fir.ref<f64>
1496  %3 = math.copysign %1, %2 : f64
1497  fir.store %3 to %0 : !fir.ref<f64>
1498  %4 = fir.load %0 : !fir.ref<f64>
1499  return %4 : f64
1500}
1501func.func @_QPtest_real10(%arg0: !fir.ref<f80> {fir.bindc_name = "x"}, %arg1: !fir.ref<f80> {fir.bindc_name = "y"}) -> f80 {
1502  %0 = fir.alloca f80 {bindc_name = "test_real10", uniq_name = "_QFtest_real10Etest_real10"}
1503  %1 = fir.load %arg0 : !fir.ref<f80>
1504  %2 = fir.load %arg1 : !fir.ref<f80>
1505  %3 = math.copysign %1, %2 : f80
1506  fir.store %3 to %0 : !fir.ref<f80>
1507  %4 = fir.load %0 : !fir.ref<f80>
1508  return %4 : f80
1509}
1510func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}, %arg1: !fir.ref<f128> {fir.bindc_name = "y"}) -> f128 {
1511  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
1512  %1 = fir.load %arg0 : !fir.ref<f128>
1513  %2 = fir.load %arg1 : !fir.ref<f128>
1514  %3 = math.copysign %1, %2 : f128
1515  fir.store %3 to %0 : !fir.ref<f128>
1516  %4 = fir.load %0 : !fir.ref<f128>
1517  return %4 : f128
1518}
1519
1520//--- sign_relaxed.fir
1521// RUN: fir-opt %t/sign_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sign_relaxed.fir
1522// CHECK: @_QPtest_real4
1523// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.copysign"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1524
1525// CHECK: @_QPtest_real8
1526// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.copysign"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1527
1528// CHECK: @_QPtest_real10
1529// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.copysign"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f80, f80) -> f80
1530
1531// CHECK: @_QPtest_real16
1532// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.copysign"({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f128, f128) -> f128
1533
1534func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
1535  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1536  %1 = fir.load %arg0 : !fir.ref<f32>
1537  %2 = fir.load %arg1 : !fir.ref<f32>
1538  %3 = math.copysign %1, %2 : f32
1539  fir.store %3 to %0 : !fir.ref<f32>
1540  %4 = fir.load %0 : !fir.ref<f32>
1541  return %4 : f32
1542}
1543func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
1544  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1545  %1 = fir.load %arg0 : !fir.ref<f64>
1546  %2 = fir.load %arg1 : !fir.ref<f64>
1547  %3 = math.copysign %1, %2 : f64
1548  fir.store %3 to %0 : !fir.ref<f64>
1549  %4 = fir.load %0 : !fir.ref<f64>
1550  return %4 : f64
1551}
1552func.func @_QPtest_real10(%arg0: !fir.ref<f80> {fir.bindc_name = "x"}, %arg1: !fir.ref<f80> {fir.bindc_name = "y"}) -> f80 {
1553  %0 = fir.alloca f80 {bindc_name = "test_real10", uniq_name = "_QFtest_real10Etest_real10"}
1554  %1 = fir.load %arg0 : !fir.ref<f80>
1555  %2 = fir.load %arg1 : !fir.ref<f80>
1556  %3 = math.copysign %1, %2 : f80
1557  fir.store %3 to %0 : !fir.ref<f80>
1558  %4 = fir.load %0 : !fir.ref<f80>
1559  return %4 : f80
1560}
1561func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}, %arg1: !fir.ref<f128> {fir.bindc_name = "y"}) -> f128 {
1562  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
1563  %1 = fir.load %arg0 : !fir.ref<f128>
1564  %2 = fir.load %arg1 : !fir.ref<f128>
1565  %3 = math.copysign %1, %2 : f128
1566  fir.store %3 to %0 : !fir.ref<f128>
1567  %4 = fir.load %0 : !fir.ref<f128>
1568  return %4 : f128
1569}
1570
1571//--- sign_precise.fir
1572// RUN: fir-opt %t/sign_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sign_precise.fir
1573// CHECK: @_QPtest_real4
1574// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @copysignf({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1575
1576// CHECK: @_QPtest_real8
1577// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1578
1579// CHECK: @_QPtest_real10
1580// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @copysignl({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f80, f80) -> f80
1581
1582// CHECK: @_QPtest_real16
1583// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.copysign.f128({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f128, f128) -> f128
1584
1585func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
1586  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1587  %1 = fir.load %arg0 : !fir.ref<f32>
1588  %2 = fir.load %arg1 : !fir.ref<f32>
1589  %3 = fir.call @copysignf(%1, %2) : (f32, f32) -> f32
1590  fir.store %3 to %0 : !fir.ref<f32>
1591  %4 = fir.load %0 : !fir.ref<f32>
1592  return %4 : f32
1593}
1594func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
1595  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1596  %1 = fir.load %arg0 : !fir.ref<f64>
1597  %2 = fir.load %arg1 : !fir.ref<f64>
1598  %3 = fir.call @copysign(%1, %2) : (f64, f64) -> f64
1599  fir.store %3 to %0 : !fir.ref<f64>
1600  %4 = fir.load %0 : !fir.ref<f64>
1601  return %4 : f64
1602}
1603func.func @_QPtest_real10(%arg0: !fir.ref<f80> {fir.bindc_name = "x"}, %arg1: !fir.ref<f80> {fir.bindc_name = "y"}) -> f80 {
1604  %0 = fir.alloca f80 {bindc_name = "test_real10", uniq_name = "_QFtest_real10Etest_real10"}
1605  %1 = fir.load %arg0 : !fir.ref<f80>
1606  %2 = fir.load %arg1 : !fir.ref<f80>
1607  %3 = fir.call @copysignl(%1, %2) : (f80, f80) -> f80
1608  fir.store %3 to %0 : !fir.ref<f80>
1609  %4 = fir.load %0 : !fir.ref<f80>
1610  return %4 : f80
1611}
1612func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}, %arg1: !fir.ref<f128> {fir.bindc_name = "y"}) -> f128 {
1613  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
1614  %1 = fir.load %arg0 : !fir.ref<f128>
1615  %2 = fir.load %arg1 : !fir.ref<f128>
1616  %3 = fir.call @llvm.copysign.f128(%1, %2) : (f128, f128) -> f128
1617  fir.store %3 to %0 : !fir.ref<f128>
1618  %4 = fir.load %0 : !fir.ref<f128>
1619  return %4 : f128
1620}
1621func.func private @copysignf(f32, f32) -> f32
1622func.func private @copysign(f64, f64) -> f64
1623func.func private @copysignl(f80, f80) -> f80
1624func.func private @llvm.copysign.f128(f128, f128) -> f128
1625
1626//--- sin_fast.fir
1627// RUN: fir-opt %t/sin_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sin_fast.fir
1628// CHECK: @_QPtest_real4
1629// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.sin"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1630
1631// CHECK: @_QPtest_real8
1632// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.sin"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1633
1634func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1635  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1636  %1 = fir.load %arg0 : !fir.ref<f32>
1637  %2 = math.sin %1 : f32
1638  fir.store %2 to %0 : !fir.ref<f32>
1639  %3 = fir.load %0 : !fir.ref<f32>
1640  return %3 : f32
1641}
1642func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1643  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1644  %1 = fir.load %arg0 : !fir.ref<f64>
1645  %2 = math.sin %1 : f64
1646  fir.store %2 to %0 : !fir.ref<f64>
1647  %3 = fir.load %0 : !fir.ref<f64>
1648  return %3 : f64
1649}
1650
1651//--- sin_relaxed.fir
1652// RUN: fir-opt %t/sin_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sin_relaxed.fir
1653// CHECK: @_QPtest_real4
1654// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.sin"({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1655
1656// CHECK: @_QPtest_real8
1657// CHECK: {{%[A-Za-z0-9._]+}} = "llvm.intr.sin"({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1658
1659func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1660  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1661  %1 = fir.load %arg0 : !fir.ref<f32>
1662  %2 = math.sin %1 : f32
1663  fir.store %2 to %0 : !fir.ref<f32>
1664  %3 = fir.load %0 : !fir.ref<f32>
1665  return %3 : f32
1666}
1667func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1668  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1669  %1 = fir.load %arg0 : !fir.ref<f64>
1670  %2 = math.sin %1 : f64
1671  fir.store %2 to %0 : !fir.ref<f64>
1672  %3 = fir.load %0 : !fir.ref<f64>
1673  return %3 : f64
1674}
1675
1676//--- sin_precise.fir
1677// RUN: fir-opt %t/sin_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sin_precise.fir
1678// CHECK: @_QPtest_real4
1679// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1680
1681// CHECK: @_QPtest_real8
1682// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sin({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1683
1684func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1685  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1686  %1 = fir.load %arg0 : !fir.ref<f32>
1687  %2 = fir.call @sinf(%1) : (f32) -> f32
1688  fir.store %2 to %0 : !fir.ref<f32>
1689  %3 = fir.load %0 : !fir.ref<f32>
1690  return %3 : f32
1691}
1692func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1693  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1694  %1 = fir.load %arg0 : !fir.ref<f64>
1695  %2 = fir.call @sin(%1) : (f64) -> f64
1696  fir.store %2 to %0 : !fir.ref<f64>
1697  %3 = fir.load %0 : !fir.ref<f64>
1698  return %3 : f64
1699}
1700func.func private @sinf(f32) -> f32
1701func.func private @sin(f64) -> f64
1702
1703//--- sinh_fast.fir
1704// RUN: fir-opt %t/sinh_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sinh_fast.fir
1705// CHECK: @_QPtest_real4
1706// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1707
1708// CHECK: @_QPtest_real8
1709// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1710
1711func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1712  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1713  %1 = fir.load %arg0 : !fir.ref<f32>
1714  %2 = fir.call @sinhf(%1) : (f32) -> f32
1715  fir.store %2 to %0 : !fir.ref<f32>
1716  %3 = fir.load %0 : !fir.ref<f32>
1717  return %3 : f32
1718}
1719func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1720  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1721  %1 = fir.load %arg0 : !fir.ref<f64>
1722  %2 = fir.call @sinh(%1) : (f64) -> f64
1723  fir.store %2 to %0 : !fir.ref<f64>
1724  %3 = fir.load %0 : !fir.ref<f64>
1725  return %3 : f64
1726}
1727func.func private @sinhf(f32) -> f32
1728func.func private @sinh(f64) -> f64
1729
1730//--- sinh_relaxed.fir
1731// RUN: fir-opt %t/sinh_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sinh_relaxed.fir
1732// CHECK: @_QPtest_real4
1733// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1734
1735// CHECK: @_QPtest_real8
1736// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1737
1738func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1739  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1740  %1 = fir.load %arg0 : !fir.ref<f32>
1741  %2 = fir.call @sinhf(%1) : (f32) -> f32
1742  fir.store %2 to %0 : !fir.ref<f32>
1743  %3 = fir.load %0 : !fir.ref<f32>
1744  return %3 : f32
1745}
1746func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1747  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1748  %1 = fir.load %arg0 : !fir.ref<f64>
1749  %2 = fir.call @sinh(%1) : (f64) -> f64
1750  fir.store %2 to %0 : !fir.ref<f64>
1751  %3 = fir.load %0 : !fir.ref<f64>
1752  return %3 : f64
1753}
1754func.func private @sinhf(f32) -> f32
1755func.func private @sinh(f64) -> f64
1756
1757//--- sinh_precise.fir
1758// RUN: fir-opt %t/sinh_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sinh_precise.fir
1759// CHECK: @_QPtest_real4
1760// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1761
1762// CHECK: @_QPtest_real8
1763// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1764
1765func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1766  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1767  %1 = fir.load %arg0 : !fir.ref<f32>
1768  %2 = fir.call @sinhf(%1) : (f32) -> f32
1769  fir.store %2 to %0 : !fir.ref<f32>
1770  %3 = fir.load %0 : !fir.ref<f32>
1771  return %3 : f32
1772}
1773func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1774  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1775  %1 = fir.load %arg0 : !fir.ref<f64>
1776  %2 = fir.call @sinh(%1) : (f64) -> f64
1777  fir.store %2 to %0 : !fir.ref<f64>
1778  %3 = fir.load %0 : !fir.ref<f64>
1779  return %3 : f64
1780}
1781func.func private @sinhf(f32) -> f32
1782func.func private @sinh(f64) -> f64
1783
1784//--- tanh_fast.fir
1785// RUN: fir-opt %t/tanh_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tanh_fast.fir
1786// CHECK: @_QPtest_real4
1787// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1788
1789// CHECK: @_QPtest_real8
1790// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1791
1792func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1793  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1794  %1 = fir.load %arg0 : !fir.ref<f32>
1795  %2 = math.tanh %1 : f32
1796  fir.store %2 to %0 : !fir.ref<f32>
1797  %3 = fir.load %0 : !fir.ref<f32>
1798  return %3 : f32
1799}
1800func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1801  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1802  %1 = fir.load %arg0 : !fir.ref<f64>
1803  %2 = math.tanh %1 : f64
1804  fir.store %2 to %0 : !fir.ref<f64>
1805  %3 = fir.load %0 : !fir.ref<f64>
1806  return %3 : f64
1807}
1808
1809//--- tanh_relaxed.fir
1810// RUN: fir-opt %t/tanh_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tanh_relaxed.fir
1811// CHECK: @_QPtest_real4
1812// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1813
1814// CHECK: @_QPtest_real8
1815// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1816
1817func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1818  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1819  %1 = fir.load %arg0 : !fir.ref<f32>
1820  %2 = math.tanh %1 : f32
1821  fir.store %2 to %0 : !fir.ref<f32>
1822  %3 = fir.load %0 : !fir.ref<f32>
1823  return %3 : f32
1824}
1825func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1826  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1827  %1 = fir.load %arg0 : !fir.ref<f64>
1828  %2 = math.tanh %1 : f64
1829  fir.store %2 to %0 : !fir.ref<f64>
1830  %3 = fir.load %0 : !fir.ref<f64>
1831  return %3 : f64
1832}
1833
1834//--- tanh_precise.fir
1835// RUN: fir-opt %t/tanh_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tanh_precise.fir
1836// CHECK: @_QPtest_real4
1837// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1838
1839// CHECK: @_QPtest_real8
1840// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1841
1842func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1843  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1844  %1 = fir.load %arg0 : !fir.ref<f32>
1845  %2 = fir.call @tanhf(%1) : (f32) -> f32
1846  fir.store %2 to %0 : !fir.ref<f32>
1847  %3 = fir.load %0 : !fir.ref<f32>
1848  return %3 : f32
1849}
1850func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1851  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1852  %1 = fir.load %arg0 : !fir.ref<f64>
1853  %2 = fir.call @tanh(%1) : (f64) -> f64
1854  fir.store %2 to %0 : !fir.ref<f64>
1855  %3 = fir.load %0 : !fir.ref<f64>
1856  return %3 : f64
1857}
1858func.func private @tanhf(f32) -> f32
1859func.func private @tanh(f64) -> f64
1860
1861//--- tan_fast.fir
1862// RUN: fir-opt %t/tan_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tan_fast.fir
1863// CHECK: @_QPtest_real4
1864// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1865
1866// CHECK: @_QPtest_real8
1867// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1868
1869func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1870  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1871  %1 = fir.load %arg0 : !fir.ref<f32>
1872  %2 = math.tan %1 : f32
1873  fir.store %2 to %0 : !fir.ref<f32>
1874  %3 = fir.load %0 : !fir.ref<f32>
1875  return %3 : f32
1876}
1877func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1878  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1879  %1 = fir.load %arg0 : !fir.ref<f64>
1880  %2 = math.tan %1 : f64
1881  fir.store %2 to %0 : !fir.ref<f64>
1882  %3 = fir.load %0 : !fir.ref<f64>
1883  return %3 : f64
1884}
1885
1886//--- tan_relaxed.fir
1887// RUN: fir-opt %t/tan_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tan_relaxed.fir
1888// CHECK: @_QPtest_real4
1889// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1890
1891// CHECK: @_QPtest_real8
1892// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1893
1894func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1895  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1896  %1 = fir.load %arg0 : !fir.ref<f32>
1897  %2 = math.tan %1 : f32
1898  fir.store %2 to %0 : !fir.ref<f32>
1899  %3 = fir.load %0 : !fir.ref<f32>
1900  return %3 : f32
1901}
1902func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1903  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1904  %1 = fir.load %arg0 : !fir.ref<f64>
1905  %2 = math.tan %1 : f64
1906  fir.store %2 to %0 : !fir.ref<f64>
1907  %3 = fir.load %0 : !fir.ref<f64>
1908  return %3 : f64
1909}
1910
1911//--- tan_precise.fir
1912// RUN: fir-opt %t/tan_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tan_precise.fir
1913// CHECK: @_QPtest_real4
1914// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1915
1916// CHECK: @_QPtest_real8
1917// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1918
1919func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1920  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1921  %1 = fir.load %arg0 : !fir.ref<f32>
1922  %2 = fir.call @tanf(%1) : (f32) -> f32
1923  fir.store %2 to %0 : !fir.ref<f32>
1924  %3 = fir.load %0 : !fir.ref<f32>
1925  return %3 : f32
1926}
1927func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1928  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1929  %1 = fir.load %arg0 : !fir.ref<f64>
1930  %2 = fir.call @tan(%1) : (f64) -> f64
1931  fir.store %2 to %0 : !fir.ref<f64>
1932  %3 = fir.load %0 : !fir.ref<f64>
1933  return %3 : f64
1934}
1935func.func private @tanf(f32) -> f32
1936func.func private @tan(f64) -> f64
1937
1938