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