124 lines · plain
1// RUN: mlir-opt %s --allow-unregistered-dialect -convert-complex-to-rocdl-library-calls | FileCheck %s2 3// CHECK-DAG: @__ocml_cabs_f32(complex<f32>) -> f324// CHECK-DAG: @__ocml_cabs_f64(complex<f64>) -> f645// CHECK-DAG: @__ocml_ccos_f32(complex<f32>) -> complex<f32>6// CHECK-DAG: @__ocml_ccos_f64(complex<f64>) -> complex<f64>7// CHECK-DAG: @__ocml_cexp_f32(complex<f32>) -> complex<f32>8// CHECK-DAG: @__ocml_cexp_f64(complex<f64>) -> complex<f64>9// CHECK-DAG: @__ocml_clog_f32(complex<f32>) -> complex<f32>10// CHECK-DAG: @__ocml_clog_f64(complex<f64>) -> complex<f64>11// CHECK-DAG: @__ocml_csin_f32(complex<f32>) -> complex<f32>12// CHECK-DAG: @__ocml_csin_f64(complex<f64>) -> complex<f64>13// CHECK-DAG: @__ocml_csqrt_f32(complex<f32>) -> complex<f32>14// CHECK-DAG: @__ocml_csqrt_f64(complex<f64>) -> complex<f64>15// CHECK-DAG: @__ocml_ctan_f32(complex<f32>) -> complex<f32>16// CHECK-DAG: @__ocml_ctan_f64(complex<f64>) -> complex<f64>17// CHECK-DAG: @__ocml_ctanh_f32(complex<f32>) -> complex<f32>18// CHECK-DAG: @__ocml_ctanh_f64(complex<f64>) -> complex<f64>19 20//CHECK-LABEL: @abs_caller21func.func @abs_caller(%f: complex<f32>, %d: complex<f64>) -> (f32, f64) {22 // CHECK: %[[RF:.*]] = call @__ocml_cabs_f32(%{{.*}})23 %rf = complex.abs %f : complex<f32>24 // CHECK: %[[RD:.*]] = call @__ocml_cabs_f64(%{{.*}})25 %rd = complex.abs %d : complex<f64>26 // CHECK: return %[[RF]], %[[RD]]27 return %rf, %rd : f32, f6428}29 30//CHECK-LABEL: @cos_caller31func.func @cos_caller(%f: complex<f32>, %d: complex<f64>) -> (complex<f32>, complex<f64>) {32 // CHECK: %[[CF:.*]] = call @__ocml_ccos_f32(%{{.*}})33 %cf = complex.cos %f : complex<f32>34 // CHECK: %[[CD:.*]] = call @__ocml_ccos_f64(%{{.*}})35 %cd = complex.cos %d : complex<f64>36 // CHECK: return %[[CF]], %[[CD]]37 return %cf, %cd : complex<f32>, complex<f64>38}39 40//CHECK-LABEL: @exp_caller41func.func @exp_caller(%f: complex<f32>, %d: complex<f64>) -> (complex<f32>, complex<f64>) {42 // CHECK: %[[EF:.*]] = call @__ocml_cexp_f32(%{{.*}})43 %ef = complex.exp %f : complex<f32>44 // CHECK: %[[ED:.*]] = call @__ocml_cexp_f64(%{{.*}})45 %ed = complex.exp %d : complex<f64>46 // CHECK: return %[[EF]], %[[ED]]47 return %ef, %ed : complex<f32>, complex<f64>48}49 50//CHECK-LABEL: @log_caller51func.func @log_caller(%f: complex<f32>, %d: complex<f64>) -> (complex<f32>, complex<f64>) {52 // CHECK: %[[LF:.*]] = call @__ocml_clog_f32(%{{.*}})53 %lf = complex.log %f : complex<f32>54 // CHECK: %[[LD:.*]] = call @__ocml_clog_f64(%{{.*}})55 %ld = complex.log %d : complex<f64>56 // CHECK: return %[[LF]], %[[LD]]57 return %lf, %ld : complex<f32>, complex<f64>58}59 60//CHECK-LABEL: @pow_caller61//CHECK: (%[[Z:.*]]: complex<f32>, %[[W:.*]]: complex<f32>)62func.func @pow_caller(%z: complex<f32>, %w: complex<f32>) -> complex<f32> {63 // CHECK: %[[LOG:.*]] = call @__ocml_clog_f32(%[[Z]])64 // CHECK: %[[MUL:.*]] = complex.mul %[[W]], %[[LOG]]65 // CHECK: %[[EXP:.*]] = call @__ocml_cexp_f32(%[[MUL]])66 // CHECK: return %[[EXP]]67 %r = complex.pow %z, %w : complex<f32>68 return %r : complex<f32>69}70 71//CHECK-LABEL: @powi_caller72//CHECK: (%[[Z:.*]]: complex<f32>, %[[N:.*]]: i32)73func.func @powi_caller(%z: complex<f32>, %n: i32) -> complex<f32> {74 // CHECK: %[[N_FP:.*]] = arith.sitofp %[[N]] : i32 to f3275 // CHECK: %[[ZERO:.*]] = arith.constant 0.000000e+00 : f3276 // CHECK: %[[N_COMPLEX:.*]] = complex.create %[[N_FP]], %[[ZERO]] : complex<f32>77 // CHECK: %[[LOG:.*]] = call @__ocml_clog_f32(%[[Z]]) : (complex<f32>) -> complex<f32>78 // CHECK: %[[MUL:.*]] = complex.mul %[[N_COMPLEX]], %[[LOG]] : complex<f32>79 // CHECK: %[[EXP:.*]] = call @__ocml_cexp_f32(%[[MUL]]) : (complex<f32>) -> complex<f32>80 // CHECK: return %[[EXP]] : complex<f32>81 %r = complex.powi %z, %n : complex<f32>, i3282 return %r : complex<f32>83}84 85//CHECK-LABEL: @sin_caller86func.func @sin_caller(%f: complex<f32>, %d: complex<f64>) -> (complex<f32>, complex<f64>) {87 // CHECK: %[[SF:.*]] = call @__ocml_csin_f32(%{{.*}})88 %sf2 = complex.sin %f : complex<f32>89 // CHECK: %[[SD:.*]] = call @__ocml_csin_f64(%{{.*}})90 %sd2 = complex.sin %d : complex<f64>91 // CHECK: return %[[SF]], %[[SD]]92 return %sf2, %sd2 : complex<f32>, complex<f64>93}94 95//CHECK-LABEL: @sqrt_caller96func.func @sqrt_caller(%f: complex<f32>, %d: complex<f64>) -> (complex<f32>, complex<f64>) {97 // CHECK: %[[SF:.*]] = call @__ocml_csqrt_f32(%{{.*}})98 %sf = complex.sqrt %f : complex<f32>99 // CHECK: %[[SD:.*]] = call @__ocml_csqrt_f64(%{{.*}})100 %sd = complex.sqrt %d : complex<f64>101 // CHECK: return %[[SF]], %[[SD]]102 return %sf, %sd : complex<f32>, complex<f64>103}104 105//CHECK-LABEL: @tan_caller106func.func @tan_caller(%f: complex<f32>, %d: complex<f64>) -> (complex<f32>, complex<f64>) {107 // CHECK: %[[TF:.*]] = call @__ocml_ctan_f32(%{{.*}})108 %tf2 = complex.tan %f : complex<f32>109 // CHECK: %[[TD:.*]] = call @__ocml_ctan_f64(%{{.*}})110 %td2 = complex.tan %d : complex<f64>111 // CHECK: return %[[TF]], %[[TD]]112 return %tf2, %td2 : complex<f32>, complex<f64>113}114 115//CHECK-LABEL: @tanh_caller116func.func @tanh_caller(%f: complex<f32>, %d: complex<f64>) -> (complex<f32>, complex<f64>) {117 // CHECK: %[[TF:.*]] = call @__ocml_ctanh_f32(%{{.*}})118 %tf = complex.tanh %f : complex<f32>119 // CHECK: %[[TD:.*]] = call @__ocml_ctanh_f64(%{{.*}})120 %td = complex.tanh %d : complex<f64>121 // CHECK: return %[[TF]], %[[TD]]122 return %tf, %td : complex<f32>, complex<f64>123}124