xref: /llvm-project/flang/test/Intrinsics/math-codegen.fir (revision c4204c0b29a6721267b1bcbaeedd7b1118e42396)
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.absf %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.absf %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.absf %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<complex<f32>> {fir.bindc_name = "c"}) -> complex<f32> {
46  %0 = fir.alloca complex<f32> {bindc_name = "test_complex4", uniq_name = "_QFtest_complex4Etest_complex4"}
47  %1 = fir.load %arg0 : !fir.ref<complex<f32>>
48  %2 = fir.extract_value %1, [0 : index] : (complex<f32>) -> f32
49  %3 = fir.extract_value %1, [1 : index] : (complex<f32>) -> f32
50  %4 = fir.call @hypotf(%2, %3) : (f32, f32) -> f32
51  %cst = arith.constant 0.000000e+00 : f32
52  %5 = fir.undefined complex<f32>
53  %6 = fir.insert_value %5, %4, [0 : index] : (complex<f32>, f32) -> complex<f32>
54  %7 = fir.insert_value %6, %cst, [1 : index] : (complex<f32>, f32) -> complex<f32>
55  fir.store %7 to %0 : !fir.ref<complex<f32>>
56  %8 = fir.load %0 : !fir.ref<complex<f32>>
57  return %8 : complex<f32>
58}
59func.func @_QPtest_complex8(%arg0: !fir.ref<complex<f64>> {fir.bindc_name = "c"}) -> complex<f64> {
60  %0 = fir.alloca complex<f64> {bindc_name = "test_complex8", uniq_name = "_QFtest_complex8Etest_complex8"}
61  %1 = fir.load %arg0 : !fir.ref<complex<f64>>
62  %2 = fir.extract_value %1, [0 : index] : (complex<f64>) -> f64
63  %3 = fir.extract_value %1, [1 : index] : (complex<f64>) -> f64
64  %4 = fir.call @hypot(%2, %3) : (f64, f64) -> f64
65  %cst = arith.constant 0.000000e+00 : f64
66  %5 = fir.undefined complex<f64>
67  %6 = fir.insert_value %5, %4, [0 : index] : (complex<f64>, f64) -> complex<f64>
68  %7 = fir.insert_value %6, %cst, [1 : index] : (complex<f64>, f64) -> complex<f64>
69  fir.store %7 to %0 : !fir.ref<complex<f64>>
70  %8 = fir.load %0 : !fir.ref<complex<f64>>
71  return %8 : complex<f64>
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.absf %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.absf %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.absf %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<complex<f32>> {fir.bindc_name = "c"}) -> complex<f32> {
118  %0 = fir.alloca complex<f32> {bindc_name = "test_complex4", uniq_name = "_QFtest_complex4Etest_complex4"}
119  %1 = fir.load %arg0 : !fir.ref<complex<f32>>
120  %2 = fir.extract_value %1, [0 : index] : (complex<f32>) -> f32
121  %3 = fir.extract_value %1, [1 : index] : (complex<f32>) -> f32
122  %4 = fir.call @hypotf(%2, %3) : (f32, f32) -> f32
123  %cst = arith.constant 0.000000e+00 : f32
124  %5 = fir.undefined complex<f32>
125  %6 = fir.insert_value %5, %4, [0 : index] : (complex<f32>, f32) -> complex<f32>
126  %7 = fir.insert_value %6, %cst, [1 : index] : (complex<f32>, f32) -> complex<f32>
127  fir.store %7 to %0 : !fir.ref<complex<f32>>
128  %8 = fir.load %0 : !fir.ref<complex<f32>>
129  return %8 : complex<f32>
130}
131func.func @_QPtest_complex8(%arg0: !fir.ref<complex<f64>> {fir.bindc_name = "c"}) -> complex<f64> {
132  %0 = fir.alloca complex<f64> {bindc_name = "test_complex8", uniq_name = "_QFtest_complex8Etest_complex8"}
133  %1 = fir.load %arg0 : !fir.ref<complex<f64>>
134  %2 = fir.extract_value %1, [0 : index] : (complex<f64>) -> f64
135  %3 = fir.extract_value %1, [1 : index] : (complex<f64>) -> f64
136  %4 = fir.call @hypot(%2, %3) : (f64, f64) -> f64
137  %cst = arith.constant 0.000000e+00 : f64
138  %5 = fir.undefined complex<f64>
139  %6 = fir.insert_value %5, %4, [0 : index] : (complex<f64>, f64) -> complex<f64>
140  %7 = fir.insert_value %6, %cst, [1 : index] : (complex<f64>, f64) -> complex<f64>
141  fir.store %7 to %0 : !fir.ref<complex<f64>>
142  %8 = fir.load %0 : !fir.ref<complex<f64>>
143  return %8 : complex<f64>
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<complex<f32>> {fir.bindc_name = "c"}) -> complex<f32> {
190  %0 = fir.alloca complex<f32> {bindc_name = "test_complex4", uniq_name = "_QFtest_complex4Etest_complex4"}
191  %1 = fir.load %arg0 : !fir.ref<complex<f32>>
192  %2 = fir.extract_value %1, [0 : index] : (complex<f32>) -> f32
193  %3 = fir.extract_value %1, [1 : index] : (complex<f32>) -> f32
194  %4 = fir.call @hypotf(%2, %3) : (f32, f32) -> f32
195  %cst = arith.constant 0.000000e+00 : f32
196  %5 = fir.undefined complex<f32>
197  %6 = fir.insert_value %5, %4, [0 : index] : (complex<f32>, f32) -> complex<f32>
198  %7 = fir.insert_value %6, %cst, [1 : index] : (complex<f32>, f32) -> complex<f32>
199  fir.store %7 to %0 : !fir.ref<complex<f32>>
200  %8 = fir.load %0 : !fir.ref<complex<f32>>
201  return %8 : complex<f32>
202}
203func.func @_QPtest_complex8(%arg0: !fir.ref<complex<f64>> {fir.bindc_name = "c"}) -> complex<f64> {
204  %0 = fir.alloca complex<f64> {bindc_name = "test_complex8", uniq_name = "_QFtest_complex8Etest_complex8"}
205  %1 = fir.load %arg0 : !fir.ref<complex<f64>>
206  %2 = fir.extract_value %1, [0 : index] : (complex<f64>) -> f64
207  %3 = fir.extract_value %1, [1 : index] : (complex<f64>) -> f64
208  %4 = fir.call @hypot(%2, %3) : (f64, f64) -> f64
209  %cst = arith.constant 0.000000e+00 : f64
210  %5 = fir.undefined complex<f64>
211  %6 = fir.insert_value %5, %4, [0 : index] : (complex<f64>, f64) -> complex<f64>
212  %7 = fir.insert_value %6, %cst, [1 : index] : (complex<f64>, f64) -> complex<f64>
213  fir.store %7 to %0 : !fir.ref<complex<f64>>
214  %8 = fir.load %0 : !fir.ref<complex<f64>>
215  return %8 : complex<f64>
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//--- exponentiation_integer.fir
1470// RUN: fir-opt %t/exponentiation_integer.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/exponentiation_integer.fir --check-prefixes="CHECK,CHECK-COMDAT"
1471// RUN: fir-opt %t/exponentiation_integer.fir --fir-to-llvm-ir="target=x86_64-pc-windows-msvc" | FileCheck %t/exponentiation_integer.fir --check-prefixes="CHECK,CHECK-COMDAT"
1472// RUN: fir-opt %t/exponentiation_integer.fir --fir-to-llvm-ir="target=aarch64-apple-darwin" | FileCheck %t/exponentiation_integer.fir --check-prefixes="CHECK,CHECK-NOCOMDAT"
1473// CHECK-COMDAT: llvm.comdat_selector @__mlir_math_ipowi_i32 any
1474// CHECK-NOCOMDAT-NOT: llvm.comdat_selector @__mlir_math_ipowi_i32 any
1475// CHECK: @_QPtest_int4
1476// CHECK: llvm.call @__mlir_math_ipowi_i32({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (i32, i32) -> i32
1477// CHECK-COMDAT: llvm.func linkonce_odr @__mlir_math_ipowi_i32(%arg0: i32, %arg1: i32) -> i32 comdat(@__llvm_comdat::@__mlir_math_ipowi_i32)
1478// CHECK-NOCOMDAT: llvm.func linkonce_odr @__mlir_math_ipowi_i32(%arg0: i32, %arg1: i32) -> i32
1479
1480func.func @_QPtest_int4(%arg0: !fir.ref<i32> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "y"}, %arg2: !fir.ref<i32> {fir.bindc_name = "z"}) {
1481  %0 = fir.load %arg0 : !fir.ref<i32>
1482  %1 = fir.load %arg1 : !fir.ref<i32>
1483  %2 = math.ipowi %0, %1 : i32
1484  fir.store %2 to %arg2 : !fir.ref<i32>
1485  return
1486}
1487
1488//--- sign_fast.fir
1489// RUN: fir-opt %t/sign_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sign_fast.fir
1490// CHECK: @_QPtest_real4
1491// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1492
1493// CHECK: @_QPtest_real8
1494// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1495
1496// CHECK: @_QPtest_real10
1497// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f80, f80) -> f80
1498
1499// CHECK: @_QPtest_real16
1500// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f128, f128) -> f128
1501
1502func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
1503  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1504  %1 = fir.load %arg0 : !fir.ref<f32>
1505  %2 = fir.load %arg1 : !fir.ref<f32>
1506  %3 = math.copysign %1, %2 : f32
1507  fir.store %3 to %0 : !fir.ref<f32>
1508  %4 = fir.load %0 : !fir.ref<f32>
1509  return %4 : f32
1510}
1511func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
1512  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1513  %1 = fir.load %arg0 : !fir.ref<f64>
1514  %2 = fir.load %arg1 : !fir.ref<f64>
1515  %3 = math.copysign %1, %2 : f64
1516  fir.store %3 to %0 : !fir.ref<f64>
1517  %4 = fir.load %0 : !fir.ref<f64>
1518  return %4 : f64
1519}
1520func.func @_QPtest_real10(%arg0: !fir.ref<f80> {fir.bindc_name = "x"}, %arg1: !fir.ref<f80> {fir.bindc_name = "y"}) -> f80 {
1521  %0 = fir.alloca f80 {bindc_name = "test_real10", uniq_name = "_QFtest_real10Etest_real10"}
1522  %1 = fir.load %arg0 : !fir.ref<f80>
1523  %2 = fir.load %arg1 : !fir.ref<f80>
1524  %3 = math.copysign %1, %2 : f80
1525  fir.store %3 to %0 : !fir.ref<f80>
1526  %4 = fir.load %0 : !fir.ref<f80>
1527  return %4 : f80
1528}
1529func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}, %arg1: !fir.ref<f128> {fir.bindc_name = "y"}) -> f128 {
1530  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
1531  %1 = fir.load %arg0 : !fir.ref<f128>
1532  %2 = fir.load %arg1 : !fir.ref<f128>
1533  %3 = math.copysign %1, %2 : f128
1534  fir.store %3 to %0 : !fir.ref<f128>
1535  %4 = fir.load %0 : !fir.ref<f128>
1536  return %4 : f128
1537}
1538
1539//--- sign_relaxed.fir
1540// RUN: fir-opt %t/sign_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sign_relaxed.fir
1541// CHECK: @_QPtest_real4
1542// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1543
1544// CHECK: @_QPtest_real8
1545// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1546
1547// CHECK: @_QPtest_real10
1548// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f80, f80) -> f80
1549
1550// CHECK: @_QPtest_real16
1551// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f128, f128) -> f128
1552
1553func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
1554  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1555  %1 = fir.load %arg0 : !fir.ref<f32>
1556  %2 = fir.load %arg1 : !fir.ref<f32>
1557  %3 = math.copysign %1, %2 : f32
1558  fir.store %3 to %0 : !fir.ref<f32>
1559  %4 = fir.load %0 : !fir.ref<f32>
1560  return %4 : f32
1561}
1562func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
1563  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1564  %1 = fir.load %arg0 : !fir.ref<f64>
1565  %2 = fir.load %arg1 : !fir.ref<f64>
1566  %3 = math.copysign %1, %2 : f64
1567  fir.store %3 to %0 : !fir.ref<f64>
1568  %4 = fir.load %0 : !fir.ref<f64>
1569  return %4 : f64
1570}
1571func.func @_QPtest_real10(%arg0: !fir.ref<f80> {fir.bindc_name = "x"}, %arg1: !fir.ref<f80> {fir.bindc_name = "y"}) -> f80 {
1572  %0 = fir.alloca f80 {bindc_name = "test_real10", uniq_name = "_QFtest_real10Etest_real10"}
1573  %1 = fir.load %arg0 : !fir.ref<f80>
1574  %2 = fir.load %arg1 : !fir.ref<f80>
1575  %3 = math.copysign %1, %2 : f80
1576  fir.store %3 to %0 : !fir.ref<f80>
1577  %4 = fir.load %0 : !fir.ref<f80>
1578  return %4 : f80
1579}
1580func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}, %arg1: !fir.ref<f128> {fir.bindc_name = "y"}) -> f128 {
1581  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
1582  %1 = fir.load %arg0 : !fir.ref<f128>
1583  %2 = fir.load %arg1 : !fir.ref<f128>
1584  %3 = math.copysign %1, %2 : f128
1585  fir.store %3 to %0 : !fir.ref<f128>
1586  %4 = fir.load %0 : !fir.ref<f128>
1587  return %4 : f128
1588}
1589
1590//--- sign_precise.fir
1591// RUN: fir-opt %t/sign_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sign_precise.fir
1592// CHECK: @_QPtest_real4
1593// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @copysignf({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
1594
1595// CHECK: @_QPtest_real8
1596// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @copysign({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
1597
1598// CHECK: @_QPtest_real10
1599// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @copysignl({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f80, f80) -> f80
1600
1601// CHECK: @_QPtest_real16
1602// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @llvm.copysign.f128({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f128, f128) -> f128
1603
1604func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
1605  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1606  %1 = fir.load %arg0 : !fir.ref<f32>
1607  %2 = fir.load %arg1 : !fir.ref<f32>
1608  %3 = fir.call @copysignf(%1, %2) : (f32, f32) -> f32
1609  fir.store %3 to %0 : !fir.ref<f32>
1610  %4 = fir.load %0 : !fir.ref<f32>
1611  return %4 : f32
1612}
1613func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fir.ref<f64> {fir.bindc_name = "y"}) -> f64 {
1614  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1615  %1 = fir.load %arg0 : !fir.ref<f64>
1616  %2 = fir.load %arg1 : !fir.ref<f64>
1617  %3 = fir.call @copysign(%1, %2) : (f64, f64) -> f64
1618  fir.store %3 to %0 : !fir.ref<f64>
1619  %4 = fir.load %0 : !fir.ref<f64>
1620  return %4 : f64
1621}
1622func.func @_QPtest_real10(%arg0: !fir.ref<f80> {fir.bindc_name = "x"}, %arg1: !fir.ref<f80> {fir.bindc_name = "y"}) -> f80 {
1623  %0 = fir.alloca f80 {bindc_name = "test_real10", uniq_name = "_QFtest_real10Etest_real10"}
1624  %1 = fir.load %arg0 : !fir.ref<f80>
1625  %2 = fir.load %arg1 : !fir.ref<f80>
1626  %3 = fir.call @copysignl(%1, %2) : (f80, f80) -> f80
1627  fir.store %3 to %0 : !fir.ref<f80>
1628  %4 = fir.load %0 : !fir.ref<f80>
1629  return %4 : f80
1630}
1631func.func @_QPtest_real16(%arg0: !fir.ref<f128> {fir.bindc_name = "x"}, %arg1: !fir.ref<f128> {fir.bindc_name = "y"}) -> f128 {
1632  %0 = fir.alloca f128 {bindc_name = "test_real16", uniq_name = "_QFtest_real16Etest_real16"}
1633  %1 = fir.load %arg0 : !fir.ref<f128>
1634  %2 = fir.load %arg1 : !fir.ref<f128>
1635  %3 = fir.call @llvm.copysign.f128(%1, %2) : (f128, f128) -> f128
1636  fir.store %3 to %0 : !fir.ref<f128>
1637  %4 = fir.load %0 : !fir.ref<f128>
1638  return %4 : f128
1639}
1640func.func private @copysignf(f32, f32) -> f32
1641func.func private @copysign(f64, f64) -> f64
1642func.func private @copysignl(f80, f80) -> f80
1643func.func private @llvm.copysign.f128(f128, f128) -> f128
1644
1645//--- sin_fast.fir
1646// RUN: fir-opt %t/sin_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sin_fast.fir
1647// CHECK: @_QPtest_real4
1648// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.sin({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1649
1650// CHECK: @_QPtest_real8
1651// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.sin({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1652
1653func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1654  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1655  %1 = fir.load %arg0 : !fir.ref<f32>
1656  %2 = math.sin %1 : f32
1657  fir.store %2 to %0 : !fir.ref<f32>
1658  %3 = fir.load %0 : !fir.ref<f32>
1659  return %3 : f32
1660}
1661func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1662  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1663  %1 = fir.load %arg0 : !fir.ref<f64>
1664  %2 = math.sin %1 : f64
1665  fir.store %2 to %0 : !fir.ref<f64>
1666  %3 = fir.load %0 : !fir.ref<f64>
1667  return %3 : f64
1668}
1669
1670//--- sin_relaxed.fir
1671// RUN: fir-opt %t/sin_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sin_relaxed.fir
1672// CHECK: @_QPtest_real4
1673// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.sin({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1674
1675// CHECK: @_QPtest_real8
1676// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.sin({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1677
1678func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1679  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1680  %1 = fir.load %arg0 : !fir.ref<f32>
1681  %2 = math.sin %1 : f32
1682  fir.store %2 to %0 : !fir.ref<f32>
1683  %3 = fir.load %0 : !fir.ref<f32>
1684  return %3 : f32
1685}
1686func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1687  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1688  %1 = fir.load %arg0 : !fir.ref<f64>
1689  %2 = math.sin %1 : f64
1690  fir.store %2 to %0 : !fir.ref<f64>
1691  %3 = fir.load %0 : !fir.ref<f64>
1692  return %3 : f64
1693}
1694
1695//--- sin_precise.fir
1696// RUN: fir-opt %t/sin_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sin_precise.fir
1697// CHECK: @_QPtest_real4
1698// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1699
1700// CHECK: @_QPtest_real8
1701// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sin({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1702
1703func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1704  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1705  %1 = fir.load %arg0 : !fir.ref<f32>
1706  %2 = fir.call @sinf(%1) : (f32) -> f32
1707  fir.store %2 to %0 : !fir.ref<f32>
1708  %3 = fir.load %0 : !fir.ref<f32>
1709  return %3 : f32
1710}
1711func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1712  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1713  %1 = fir.load %arg0 : !fir.ref<f64>
1714  %2 = fir.call @sin(%1) : (f64) -> f64
1715  fir.store %2 to %0 : !fir.ref<f64>
1716  %3 = fir.load %0 : !fir.ref<f64>
1717  return %3 : f64
1718}
1719func.func private @sinf(f32) -> f32
1720func.func private @sin(f64) -> f64
1721
1722//--- sinh_fast.fir
1723// RUN: fir-opt %t/sinh_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sinh_fast.fir
1724// CHECK: @_QPtest_real4
1725// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1726
1727// CHECK: @_QPtest_real8
1728// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1729
1730func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1731  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1732  %1 = fir.load %arg0 : !fir.ref<f32>
1733  %2 = fir.call @sinhf(%1) : (f32) -> f32
1734  fir.store %2 to %0 : !fir.ref<f32>
1735  %3 = fir.load %0 : !fir.ref<f32>
1736  return %3 : f32
1737}
1738func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1739  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1740  %1 = fir.load %arg0 : !fir.ref<f64>
1741  %2 = fir.call @sinh(%1) : (f64) -> f64
1742  fir.store %2 to %0 : !fir.ref<f64>
1743  %3 = fir.load %0 : !fir.ref<f64>
1744  return %3 : f64
1745}
1746func.func private @sinhf(f32) -> f32
1747func.func private @sinh(f64) -> f64
1748
1749//--- sinh_relaxed.fir
1750// RUN: fir-opt %t/sinh_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sinh_relaxed.fir
1751// CHECK: @_QPtest_real4
1752// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1753
1754// CHECK: @_QPtest_real8
1755// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1756
1757func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1758  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1759  %1 = fir.load %arg0 : !fir.ref<f32>
1760  %2 = fir.call @sinhf(%1) : (f32) -> f32
1761  fir.store %2 to %0 : !fir.ref<f32>
1762  %3 = fir.load %0 : !fir.ref<f32>
1763  return %3 : f32
1764}
1765func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1766  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1767  %1 = fir.load %arg0 : !fir.ref<f64>
1768  %2 = fir.call @sinh(%1) : (f64) -> f64
1769  fir.store %2 to %0 : !fir.ref<f64>
1770  %3 = fir.load %0 : !fir.ref<f64>
1771  return %3 : f64
1772}
1773func.func private @sinhf(f32) -> f32
1774func.func private @sinh(f64) -> f64
1775
1776//--- sinh_precise.fir
1777// RUN: fir-opt %t/sinh_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/sinh_precise.fir
1778// CHECK: @_QPtest_real4
1779// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1780
1781// CHECK: @_QPtest_real8
1782// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @sinh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1783
1784func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1785  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1786  %1 = fir.load %arg0 : !fir.ref<f32>
1787  %2 = fir.call @sinhf(%1) : (f32) -> f32
1788  fir.store %2 to %0 : !fir.ref<f32>
1789  %3 = fir.load %0 : !fir.ref<f32>
1790  return %3 : f32
1791}
1792func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1793  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1794  %1 = fir.load %arg0 : !fir.ref<f64>
1795  %2 = fir.call @sinh(%1) : (f64) -> f64
1796  fir.store %2 to %0 : !fir.ref<f64>
1797  %3 = fir.load %0 : !fir.ref<f64>
1798  return %3 : f64
1799}
1800func.func private @sinhf(f32) -> f32
1801func.func private @sinh(f64) -> f64
1802
1803//--- tanh_fast.fir
1804// RUN: fir-opt %t/tanh_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tanh_fast.fir
1805// CHECK: @_QPtest_real4
1806// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1807
1808// CHECK: @_QPtest_real8
1809// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1810
1811func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1812  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1813  %1 = fir.load %arg0 : !fir.ref<f32>
1814  %2 = math.tanh %1 : f32
1815  fir.store %2 to %0 : !fir.ref<f32>
1816  %3 = fir.load %0 : !fir.ref<f32>
1817  return %3 : f32
1818}
1819func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1820  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1821  %1 = fir.load %arg0 : !fir.ref<f64>
1822  %2 = math.tanh %1 : f64
1823  fir.store %2 to %0 : !fir.ref<f64>
1824  %3 = fir.load %0 : !fir.ref<f64>
1825  return %3 : f64
1826}
1827
1828//--- tanh_relaxed.fir
1829// RUN: fir-opt %t/tanh_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tanh_relaxed.fir
1830// CHECK: @_QPtest_real4
1831// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1832
1833// CHECK: @_QPtest_real8
1834// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1835
1836func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1837  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1838  %1 = fir.load %arg0 : !fir.ref<f32>
1839  %2 = math.tanh %1 : f32
1840  fir.store %2 to %0 : !fir.ref<f32>
1841  %3 = fir.load %0 : !fir.ref<f32>
1842  return %3 : f32
1843}
1844func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1845  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1846  %1 = fir.load %arg0 : !fir.ref<f64>
1847  %2 = math.tanh %1 : f64
1848  fir.store %2 to %0 : !fir.ref<f64>
1849  %3 = fir.load %0 : !fir.ref<f64>
1850  return %3 : f64
1851}
1852
1853//--- tanh_precise.fir
1854// RUN: fir-opt %t/tanh_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tanh_precise.fir
1855// CHECK: @_QPtest_real4
1856// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1857
1858// CHECK: @_QPtest_real8
1859// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1860
1861func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1862  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1863  %1 = fir.load %arg0 : !fir.ref<f32>
1864  %2 = fir.call @tanhf(%1) : (f32) -> f32
1865  fir.store %2 to %0 : !fir.ref<f32>
1866  %3 = fir.load %0 : !fir.ref<f32>
1867  return %3 : f32
1868}
1869func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1870  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1871  %1 = fir.load %arg0 : !fir.ref<f64>
1872  %2 = fir.call @tanh(%1) : (f64) -> f64
1873  fir.store %2 to %0 : !fir.ref<f64>
1874  %3 = fir.load %0 : !fir.ref<f64>
1875  return %3 : f64
1876}
1877func.func private @tanhf(f32) -> f32
1878func.func private @tanh(f64) -> f64
1879
1880//--- tan_fast.fir
1881// RUN: fir-opt %t/tan_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tan_fast.fir
1882// CHECK: @_QPtest_real4
1883// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1884
1885// CHECK: @_QPtest_real8
1886// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1887
1888func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1889  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1890  %1 = fir.load %arg0 : !fir.ref<f32>
1891  %2 = math.tan %1 : f32
1892  fir.store %2 to %0 : !fir.ref<f32>
1893  %3 = fir.load %0 : !fir.ref<f32>
1894  return %3 : f32
1895}
1896func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1897  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1898  %1 = fir.load %arg0 : !fir.ref<f64>
1899  %2 = math.tan %1 : f64
1900  fir.store %2 to %0 : !fir.ref<f64>
1901  %3 = fir.load %0 : !fir.ref<f64>
1902  return %3 : f64
1903}
1904
1905//--- tan_relaxed.fir
1906// RUN: fir-opt %t/tan_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tan_relaxed.fir
1907// CHECK: @_QPtest_real4
1908// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1909
1910// CHECK: @_QPtest_real8
1911// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1912
1913func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1914  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1915  %1 = fir.load %arg0 : !fir.ref<f32>
1916  %2 = math.tan %1 : f32
1917  fir.store %2 to %0 : !fir.ref<f32>
1918  %3 = fir.load %0 : !fir.ref<f32>
1919  return %3 : f32
1920}
1921func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1922  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1923  %1 = fir.load %arg0 : !fir.ref<f64>
1924  %2 = math.tan %1 : f64
1925  fir.store %2 to %0 : !fir.ref<f64>
1926  %3 = fir.load %0 : !fir.ref<f64>
1927  return %3 : f64
1928}
1929
1930//--- tan_precise.fir
1931// RUN: fir-opt %t/tan_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tan_precise.fir
1932// CHECK: @_QPtest_real4
1933// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
1934
1935// CHECK: @_QPtest_real8
1936// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
1937
1938func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
1939  %0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
1940  %1 = fir.load %arg0 : !fir.ref<f32>
1941  %2 = fir.call @tanf(%1) : (f32) -> f32
1942  fir.store %2 to %0 : !fir.ref<f32>
1943  %3 = fir.load %0 : !fir.ref<f32>
1944  return %3 : f32
1945}
1946func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
1947  %0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
1948  %1 = fir.load %arg0 : !fir.ref<f64>
1949  %2 = fir.call @tan(%1) : (f64) -> f64
1950  fir.store %2 to %0 : !fir.ref<f64>
1951  %3 = fir.load %0 : !fir.ref<f64>
1952  return %3 : f64
1953}
1954func.func private @tanf(f32) -> f32
1955func.func private @tan(f64) -> f64
1956