xref: /llvm-project/mlir/test/Conversion/ComplexToLibm/convert-to-libm.mlir (revision fdcb76f2480d2a0187641cc844e92f1d6c4b2635)
1// RUN: mlir-opt %s -convert-complex-to-libm -canonicalize | FileCheck %s
2
3// CHECK-DAG: @cpowf(complex<f32>, complex<f32>) -> complex<f32>
4// CHECK-DAG: @cpow(complex<f64>, complex<f64>) -> complex<f64>
5// CHECK-DAG: @csqrtf(complex<f32>) -> complex<f32>
6// CHECK-DAG: @csqrt(complex<f64>) -> complex<f64>
7// CHECK-DAG: @ctanhf(complex<f32>) -> complex<f32>
8// CHECK-DAG: @ctanh(complex<f64>) -> complex<f64>
9// CHECK-DAG: @ccos(complex<f64>) -> complex<f64>
10// CHECK-DAG: @csin(complex<f64>) -> complex<f64>
11// CHECK-DAG: @conj(complex<f64>) -> complex<f64>
12// CHECK-DAG: @cabs(complex<f64>) -> f64
13// CHECK-DAG: @carg(complex<f64>) -> f64
14// CHECK-DAG: @clog(complex<f64>) -> complex<f64>
15// CHECK-DAG: @ctanf(complex<f32>) -> complex<f32>
16// CHECK-DAG: @ctan(complex<f64>) -> complex<f64>
17
18// CHECK-LABEL: func @cpow_caller
19// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
20// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
21func.func @cpow_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
22  // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @cpowf(%[[FLOAT]], %[[FLOAT]]) : (complex<f32>, complex<f32>) -> complex<f32>
23  %float_result = complex.pow %float, %float : complex<f32>
24  // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @cpow(%[[DOUBLE]], %[[DOUBLE]]) : (complex<f64>, complex<f64>) -> complex<f64>
25  %double_result = complex.pow %double, %double : complex<f64>
26  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
27  return %float_result, %double_result : complex<f32>, complex<f64>
28}
29
30// CHECK-LABEL: func @csqrt_caller
31// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
32// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
33func.func @csqrt_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
34  // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @csqrtf(%[[FLOAT]]) : (complex<f32>) -> complex<f32>
35  %float_result = complex.sqrt %float : complex<f32>
36  // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @csqrt(%[[DOUBLE]]) : (complex<f64>) -> complex<f64>
37  %double_result = complex.sqrt %double : complex<f64>
38  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
39  return %float_result, %double_result : complex<f32>, complex<f64>
40}
41
42// CHECK-LABEL: func @ctanh_caller
43// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
44// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
45func.func @ctanh_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
46  // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @ctanhf(%[[FLOAT]]) : (complex<f32>) -> complex<f32>
47  %float_result = complex.tanh %float : complex<f32>
48  // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @ctanh(%[[DOUBLE]]) : (complex<f64>) -> complex<f64>
49  %double_result = complex.tanh %double : complex<f64>
50  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
51  return %float_result, %double_result : complex<f32>, complex<f64>
52}
53
54// CHECK-LABEL: func @ccos_caller
55// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
56// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
57func.func @ccos_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
58  // CHECK: %[[FLOAT_RESULT:.*]] = call @ccosf(%[[FLOAT]])
59  %float_result = complex.cos %float : complex<f32>
60  // CHECK: %[[DOUBLE_RESULT:.*]] = call @ccos(%[[DOUBLE]])
61  %double_result = complex.cos %double : complex<f64>
62  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
63  return %float_result, %double_result : complex<f32>, complex<f64>
64}
65
66// CHECK-LABEL: func @csin_caller
67// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
68// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
69func.func @csin_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
70  // CHECK: %[[FLOAT_RESULT:.*]] = call @csinf(%[[FLOAT]])
71  %float_result = complex.sin %float : complex<f32>
72  // CHECK: %[[DOUBLE_RESULT:.*]] = call @csin(%[[DOUBLE]])
73  %double_result = complex.sin %double : complex<f64>
74  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
75  return %float_result, %double_result : complex<f32>, complex<f64>
76}
77
78// CHECK-LABEL: func @conj_caller
79// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
80// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
81func.func @conj_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
82  // CHECK: %[[FLOAT_RESULT:.*]] = call @conjf(%[[FLOAT]])
83  %float_result = complex.conj %float : complex<f32>
84  // CHECK: %[[DOUBLE_RESULT:.*]] = call @conj(%[[DOUBLE]])
85  %double_result = complex.conj %double : complex<f64>
86  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
87  return %float_result, %double_result : complex<f32>, complex<f64>
88}
89
90// CHECK-LABEL: func @cabs_caller
91// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
92// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
93func.func @cabs_caller(%float: complex<f32>, %double: complex<f64>) -> (f32, f64)  {
94  // CHECK: %[[FLOAT_RESULT:.*]] = call @cabsf(%[[FLOAT]])
95  %float_result = complex.abs %float : complex<f32>
96  // CHECK: %[[DOUBLE_RESULT:.*]] = call @cabs(%[[DOUBLE]])
97  %double_result = complex.abs %double : complex<f64>
98  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
99  return %float_result, %double_result : f32, f64
100}
101
102// CHECK-LABEL: func @carg_caller
103// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
104// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
105func.func @carg_caller(%float: complex<f32>, %double: complex<f64>) -> (f32, f64)  {
106  // CHECK: %[[FLOAT_RESULT:.*]] = call @cargf(%[[FLOAT]])
107  %float_result = complex.angle %float : complex<f32>
108  // CHECK: %[[DOUBLE_RESULT:.*]] = call @carg(%[[DOUBLE]])
109  %double_result = complex.angle %double : complex<f64>
110  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
111  return %float_result, %double_result : f32, f64
112}
113
114// CHECK-LABEL: func @clog_caller
115// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
116// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
117func.func @clog_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
118  // CHECK: %[[FLOAT_RESULT:.*]] = call @clogf(%[[FLOAT]])
119  %float_result = complex.log %float : complex<f32>
120  // CHECK: %[[DOUBLE_RESULT:.*]] = call @clog(%[[DOUBLE]])
121  %double_result = complex.log %double : complex<f64>
122  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
123  return %float_result, %double_result : complex<f32>, complex<f64>
124}
125
126// CHECK-LABEL: func @ctan_caller
127// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
128// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
129func.func @ctan_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
130  // CHECK: %[[FLOAT_RESULT:.*]] = call @ctanf(%[[FLOAT]])
131  %float_result = complex.tan %float : complex<f32>
132  // CHECK: %[[DOUBLE_RESULT:.*]] = call @ctan(%[[DOUBLE]])
133  %double_result = complex.tan %double : complex<f64>
134  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
135  return %float_result, %double_result : complex<f32>, complex<f64>
136}
137