// RUN: mlir-opt %s --allow-unregistered-dialect -convert-complex-to-rocdl-library-calls | FileCheck %s // CHECK-DAG: @__ocml_cabs_f32(complex) -> f32 // CHECK-DAG: @__ocml_cabs_f64(complex) -> f64 // CHECK-DAG: @__ocml_ccos_f32(complex) -> complex // CHECK-DAG: @__ocml_ccos_f64(complex) -> complex // CHECK-DAG: @__ocml_cexp_f32(complex) -> complex // CHECK-DAG: @__ocml_cexp_f64(complex) -> complex // CHECK-DAG: @__ocml_clog_f32(complex) -> complex // CHECK-DAG: @__ocml_clog_f64(complex) -> complex // CHECK-DAG: @__ocml_csin_f32(complex) -> complex // CHECK-DAG: @__ocml_csin_f64(complex) -> complex // CHECK-DAG: @__ocml_csqrt_f32(complex) -> complex // CHECK-DAG: @__ocml_csqrt_f64(complex) -> complex // CHECK-DAG: @__ocml_ctan_f32(complex) -> complex // CHECK-DAG: @__ocml_ctan_f64(complex) -> complex // CHECK-DAG: @__ocml_ctanh_f32(complex) -> complex // CHECK-DAG: @__ocml_ctanh_f64(complex) -> complex //CHECK-LABEL: @abs_caller func.func @abs_caller(%f: complex, %d: complex) -> (f32, f64) { // CHECK: %[[RF:.*]] = call @__ocml_cabs_f32(%{{.*}}) %rf = complex.abs %f : complex // CHECK: %[[RD:.*]] = call @__ocml_cabs_f64(%{{.*}}) %rd = complex.abs %d : complex // CHECK: return %[[RF]], %[[RD]] return %rf, %rd : f32, f64 } //CHECK-LABEL: @cos_caller func.func @cos_caller(%f: complex, %d: complex) -> (complex, complex) { // CHECK: %[[CF:.*]] = call @__ocml_ccos_f32(%{{.*}}) %cf = complex.cos %f : complex // CHECK: %[[CD:.*]] = call @__ocml_ccos_f64(%{{.*}}) %cd = complex.cos %d : complex // CHECK: return %[[CF]], %[[CD]] return %cf, %cd : complex, complex } //CHECK-LABEL: @exp_caller func.func @exp_caller(%f: complex, %d: complex) -> (complex, complex) { // CHECK: %[[EF:.*]] = call @__ocml_cexp_f32(%{{.*}}) %ef = complex.exp %f : complex // CHECK: %[[ED:.*]] = call @__ocml_cexp_f64(%{{.*}}) %ed = complex.exp %d : complex // CHECK: return %[[EF]], %[[ED]] return %ef, %ed : complex, complex } //CHECK-LABEL: @log_caller func.func @log_caller(%f: complex, %d: complex) -> (complex, complex) { // CHECK: %[[LF:.*]] = call @__ocml_clog_f32(%{{.*}}) %lf = complex.log %f : complex // CHECK: %[[LD:.*]] = call @__ocml_clog_f64(%{{.*}}) %ld = complex.log %d : complex // CHECK: return %[[LF]], %[[LD]] return %lf, %ld : complex, complex } //CHECK-LABEL: @pow_caller //CHECK: (%[[Z:.*]]: complex, %[[W:.*]]: complex) func.func @pow_caller(%z: complex, %w: complex) -> complex { // CHECK: %[[LOG:.*]] = call @__ocml_clog_f32(%[[Z]]) // CHECK: %[[MUL:.*]] = complex.mul %[[W]], %[[LOG]] // CHECK: %[[EXP:.*]] = call @__ocml_cexp_f32(%[[MUL]]) // CHECK: return %[[EXP]] %r = complex.pow %z, %w : complex return %r : complex } //CHECK-LABEL: @powi_caller //CHECK: (%[[Z:.*]]: complex, %[[N:.*]]: i32) func.func @powi_caller(%z: complex, %n: i32) -> complex { // CHECK: %[[N_FP:.*]] = arith.sitofp %[[N]] : i32 to f32 // CHECK: %[[ZERO:.*]] = arith.constant 0.000000e+00 : f32 // CHECK: %[[N_COMPLEX:.*]] = complex.create %[[N_FP]], %[[ZERO]] : complex // CHECK: %[[LOG:.*]] = call @__ocml_clog_f32(%[[Z]]) : (complex) -> complex // CHECK: %[[MUL:.*]] = complex.mul %[[N_COMPLEX]], %[[LOG]] : complex // CHECK: %[[EXP:.*]] = call @__ocml_cexp_f32(%[[MUL]]) : (complex) -> complex // CHECK: return %[[EXP]] : complex %r = complex.powi %z, %n : complex, i32 return %r : complex } //CHECK-LABEL: @sin_caller func.func @sin_caller(%f: complex, %d: complex) -> (complex, complex) { // CHECK: %[[SF:.*]] = call @__ocml_csin_f32(%{{.*}}) %sf2 = complex.sin %f : complex // CHECK: %[[SD:.*]] = call @__ocml_csin_f64(%{{.*}}) %sd2 = complex.sin %d : complex // CHECK: return %[[SF]], %[[SD]] return %sf2, %sd2 : complex, complex } //CHECK-LABEL: @sqrt_caller func.func @sqrt_caller(%f: complex, %d: complex) -> (complex, complex) { // CHECK: %[[SF:.*]] = call @__ocml_csqrt_f32(%{{.*}}) %sf = complex.sqrt %f : complex // CHECK: %[[SD:.*]] = call @__ocml_csqrt_f64(%{{.*}}) %sd = complex.sqrt %d : complex // CHECK: return %[[SF]], %[[SD]] return %sf, %sd : complex, complex } //CHECK-LABEL: @tan_caller func.func @tan_caller(%f: complex, %d: complex) -> (complex, complex) { // CHECK: %[[TF:.*]] = call @__ocml_ctan_f32(%{{.*}}) %tf2 = complex.tan %f : complex // CHECK: %[[TD:.*]] = call @__ocml_ctan_f64(%{{.*}}) %td2 = complex.tan %d : complex // CHECK: return %[[TF]], %[[TD]] return %tf2, %td2 : complex, complex } //CHECK-LABEL: @tanh_caller func.func @tanh_caller(%f: complex, %d: complex) -> (complex, complex) { // CHECK: %[[TF:.*]] = call @__ocml_ctanh_f32(%{{.*}}) %tf = complex.tanh %f : complex // CHECK: %[[TD:.*]] = call @__ocml_ctanh_f64(%{{.*}}) %td = complex.tanh %d : complex // CHECK: return %[[TF]], %[[TD]] return %tf, %td : complex, complex }