diff --git a/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td b/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td --- a/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td +++ b/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td @@ -29,47 +29,52 @@ let verifier = ?; } +// Base class for standard unary operations on complex numbers with a +// floating-point element type. These operations take one operand and return +// one result; the operand must be a complex number. +class ComplexUnaryOp traits = []> : + Complex_Op { + let arguments = (ins Complex:$complex); + let assemblyFormat = "$complex attr-dict `:` type($complex)"; + let verifier = ?; +} + //===----------------------------------------------------------------------===// -// AddOp +// AbsOp //===----------------------------------------------------------------------===// -def AddOp : ComplexArithmeticOp<"add"> { - let summary = "complex addition"; +def AbsOp : ComplexUnaryOp<"abs", + [TypesMatchWith<"complex element type matches result type", + "complex", "result", + "$_self.cast().getElementType()">]> { + let summary = "computes absolute value of a complex number"; let description = [{ - The `add` operation takes two complex numbers and returns their sum. + The `abs` op takes a single complex number and computes its absolute value. Example: ```mlir - %a = complex.add %b, %c : complex + %a = complex.abs %b : complex ``` }]; + let results = (outs AnyFloat:$result); } //===----------------------------------------------------------------------===// -// AbsOp +// AddOp //===----------------------------------------------------------------------===// -def AbsOp : Complex_Op<"abs", - [NoSideEffect, - TypesMatchWith<"complex element type matches result type", - "complex", "result", - "$_self.cast().getElementType()">]> { - let summary = "computes absolute value of a complex number"; +def AddOp : ComplexArithmeticOp<"add"> { + let summary = "complex addition"; let description = [{ - The `abs` op takes a single complex number and computes its absolute value. + The `add` operation takes two complex numbers and returns their sum. Example: ```mlir - %a = complex.abs %b : complex + %a = complex.add %b, %c : complex ``` }]; - - let arguments = (ins Complex:$complex); - let results = (outs AnyFloat:$result); - - let assemblyFormat = "$complex attr-dict `:` type($complex)"; } //===----------------------------------------------------------------------===// @@ -121,33 +126,6 @@ }]; } -//===----------------------------------------------------------------------===// -// ImOp -//===----------------------------------------------------------------------===// - -def ImOp : Complex_Op<"im", - [NoSideEffect, - TypesMatchWith<"complex element type matches result type", - "complex", "imaginary", - "$_self.cast().getElementType()">]> { - let summary = "extracts the imaginary part of a complex number"; - let description = [{ - The `im` op takes a single complex number and extracts the imaginary part. - - Example: - - ```mlir - %a = complex.im %b : complex - ``` - }]; - - let arguments = (ins Complex:$complex); - let results = (outs AnyFloat:$imaginary); - - let assemblyFormat = "$complex attr-dict `:` type($complex)"; - let hasFolder = 1; -} - //===----------------------------------------------------------------------===// // EqualOp //===----------------------------------------------------------------------===// @@ -177,6 +155,29 @@ let assemblyFormat = "$lhs `,` $rhs attr-dict `:` type($lhs)"; } +//===----------------------------------------------------------------------===// +// ImOp +//===----------------------------------------------------------------------===// + +def ImOp : ComplexUnaryOp<"im", + [TypesMatchWith<"complex element type matches result type", + "complex", "imaginary", + "$_self.cast().getElementType()">]> { + let summary = "extracts the imaginary part of a complex number"; + let description = [{ + The `im` op takes a single complex number and extracts the imaginary part. + + Example: + + ```mlir + %a = complex.im %b : complex + ``` + }]; + + let results = (outs AnyFloat:$imaginary); + let hasFolder = 1; +} + //===----------------------------------------------------------------------===// // MulOp //===----------------------------------------------------------------------===// @@ -226,9 +227,8 @@ // ReOp //===----------------------------------------------------------------------===// -def ReOp : Complex_Op<"re", - [NoSideEffect, - TypesMatchWith<"complex element type matches result type", +def ReOp : ComplexUnaryOp<"re", + [TypesMatchWith<"complex element type matches result type", "complex", "real", "$_self.cast().getElementType()">]> { let summary = "extracts the real part of a complex number"; @@ -242,10 +242,7 @@ ``` }]; - let arguments = (ins Complex:$complex); let results = (outs AnyFloat:$real); - - let assemblyFormat = "$complex attr-dict `:` type($complex)"; let hasFolder = 1; }