Add LogOp to Complex dialect.
authorAdrian Kuegel <akuegel@google.com>
Fri, 2 Jul 2021 09:03:19 +0000 (11:03 +0200)
committerAdrian Kuegel <akuegel@google.com>
Fri, 2 Jul 2021 11:15:47 +0000 (13:15 +0200)
Differential Revision: https://reviews.llvm.org/D105337

mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td
mlir/test/Dialect/Complex/ops.mlir

index d533b5d..a116242 100644 (file)
@@ -159,7 +159,7 @@ def ExpOp : ComplexUnaryOp<"exp", [SameOperandsAndResultType]> {
   let summary = "computes exponential of a complex number";
   let description = [{
     The `exp` op takes a single complex number and computes the exponential of
-    it, i.e. `exp(x)` or `e^(x)`, where `x` is the input tensor.
+    it, i.e. `exp(x)` or `e^(x)`, where `x` is the input value.
     `e` denotes Euler's number and is approximately equal to 2.718281.
 
     Example:
@@ -196,6 +196,27 @@ def ImOp : ComplexUnaryOp<"im",
 }
 
 //===----------------------------------------------------------------------===//
+// LogOp
+//===----------------------------------------------------------------------===//
+
+def LogOp : ComplexUnaryOp<"log", [SameOperandsAndResultType]> {
+  let summary = "computes natural logarithm of a complex number";
+  let description = [{
+    The `log` op takes a single complex number and computes the natural
+    logarithm of it, i.e. `log(x)` or `log_e(x)`, where `x` is the input value.
+    `e` denotes Euler's number and is approximately equal to 2.718281.
+
+    Example:
+
+    ```mlir
+    %a = complex.log %b : complex<f32>
+    ```
+  }];
+
+  let results = (outs Complex<AnyFloat>:$result);
+}
+
+//===----------------------------------------------------------------------===//
 // MulOp
 //===----------------------------------------------------------------------===//
 
index 09d31ba..74b45b8 100644 (file)
@@ -26,12 +26,24 @@ func @ops(%f: f32) {
   // CHECK: complex.eq %[[C]], %[[C]] : complex<f32>
   %eq = complex.eq %complex, %complex : complex<f32>
 
-  // CHECK: complex.neq %[[C]], %[[C]] : complex<f32>
-  %neq = complex.neq %complex, %complex : complex<f32>
+  // CHECK: complex.exp %[[C]] : complex<f32>
+  %exp = complex.exp %complex : complex<f32>
+
+  // CHECK: complex.log %[[C]] : complex<f32>
+  %log = complex.log %complex : complex<f32>
 
   // CHECK: complex.mul %[[C]], %[[C]] : complex<f32>
   %prod = complex.mul %complex, %complex : complex<f32>
 
+  // CHECK: complex.neg %[[C]] : complex<f32>
+  %neg = complex.neg %complex : complex<f32>
+
+  // CHECK: complex.neq %[[C]], %[[C]] : complex<f32>
+  %neq = complex.neq %complex, %complex : complex<f32>
+
+  // CHECK: complex.sign %[[C]] : complex<f32>
+  %sign = complex.sign %complex : complex<f32>
+
   // CHECK: complex.sub %[[C]], %[[C]] : complex<f32>
   %diff = complex.sub %complex, %complex : complex<f32>
   return