blob: 2cc977f117cfb3e1f8012a851907fc5fa6a44476 [file] [log] [blame]
//===- MathOps.td - Math op definitions --------------------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef MATH_OPS
#define MATH_OPS
include "mlir/Dialect/Math/IR/MathBase.td"
include "mlir/Interfaces/InferTypeOpInterface.td"
include "mlir/Interfaces/VectorInterfaces.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
// Base class for math dialect ops. Ops in this dialect have no side effects and
// can be applied element-wise to vectors and tensors.
class Math_Op<string mnemonic, list<OpTrait> traits = []> :
Op<Math_Dialect, mnemonic, traits # [NoSideEffect,
DeclareOpInterfaceMethods<VectorUnrollOpInterface>] #
ElementwiseMappable.traits>;
// Base class for unary math operations on floating point types. Require a
// operand and result of the same type. This type can be a floating point type,
// or vector or tensor thereof.
class Math_FloatUnaryOp<string mnemonic, list<OpTrait> traits = []> :
Math_Op<mnemonic, traits # [SameOperandsAndResultType]> {
let arguments = (ins FloatLike:$operand);
let results = (outs FloatLike:$result);
let assemblyFormat = "$operand attr-dict `:` type($result)";
}
// Base class for binary math operations on floating point types. Require two
// operands and one result of the same type. This type can be a floating point
// type, or a vector or tensor thereof.
class Math_FloatBinaryOp<string mnemonic, list<OpTrait> traits = []> :
Math_Op<mnemonic, traits # [SameOperandsAndResultType]> {
let arguments = (ins FloatLike:$lhs, FloatLike:$rhs);
let results = (outs FloatLike:$result);
let assemblyFormat = "$lhs `,` $rhs attr-dict `:` type($result)";
}
// Base class for floating point ternary operations. Require three operands and
// one result of the same type. This type can be a floating point type, or a
// vector or tensor thereof.
class Math_FloatTernaryOp<string mnemonic, list<OpTrait> traits = []> :
Math_Op<mnemonic, traits # [SameOperandsAndResultType]> {
let arguments = (ins FloatLike:$a, FloatLike:$b, FloatLike:$c);
let results = (outs FloatLike:$result);
let assemblyFormat = "$a `,` $b `,` $c attr-dict `:` type($result)";
}
//===----------------------------------------------------------------------===//
// AbsOp
//===----------------------------------------------------------------------===//
def Math_AbsOp : Math_FloatUnaryOp<"abs"> {
let summary = "floating point absolute-value operation";
let description = [{
The `abs` operation computes the absolute value. It takes one operand and
returns one result of the same type. This type may be a float scalar type,
a vector whose element type is float, or a tensor of floats.
Example:
```mlir
// Scalar absolute value.
%a = math.abs %b : f64
// SIMD vector element-wise absolute value.
%f = math.abs %g : vector<4xf32>
// Tensor element-wise absolute value.
%x = math.abs %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// AtanOp
//===----------------------------------------------------------------------===//
def Math_AtanOp : Math_FloatUnaryOp<"atan">{
let summary = "arcus tangent of the given value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.atan` ssa-use `:` type
```
The `atan` operation computes the arcus tangent of a given value. It takes
one operand and returns one result of the same type. This type may be a
float scalar type, a vector whose element type is float, or a tensor of
floats. It has no standard attributes.
Example:
```mlir
// Arcus tangent of scalar value.
%a = math.atan %b : f64
// SIMD vector element-wise arcus tangent.
%f = math.atan %g : vector<4xf32>
// Tensor element-wise arcus tangent.
%x = math.atan %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// Atan2Op
//===----------------------------------------------------------------------===//
def Math_Atan2Op : Math_FloatBinaryOp<"atan2">{
let summary = "2-argument arcus tangent of the given values";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.atan2` ssa-use `,` ssa-use `:` type
```
The `atan2` operation takes two operands and returns one result, all of
which must be of the same type. This type may be a floating point scalar
type, a vector whose element type is a floating point type, or a floating
point tensor.
The 2-argument arcus tangent `atan2(y, x)` returns the angle in the
Euclidian plane between the positive x-axis and the ray through the point
(x, y). It is a generalization of the 1-argument arcus tangent which
returns the angle on the basis of the ratio y/x.
See also https://en.wikipedia.org/wiki/Atan2
Example:
```mlir
// Scalar variant.
%a = math.atan2 %b, %c : f32
// SIMD vector variant.
%f = math.atan2 %g, %h : vector<4xf32>
// Tensor variant.
%x = math.atan2 %y, %z : tensor<4x?xf32>
```
}];
}
//===----------------------------------------------------------------------===//
// CeilOp
//===----------------------------------------------------------------------===//
def Math_CeilOp : Math_FloatUnaryOp<"ceil"> {
let summary = "ceiling of the specified value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.ceil` ssa-use `:` type
```
The `ceil` operation computes the ceiling of a given value. It takes one
operand and returns one result of the same type. This type may be a float
scalar type, a vector whose element type is float, or a tensor of floats.
It has no standard attributes.
Example:
```mlir
// Scalar ceiling value.
%a = math.ceil %b : f64
// SIMD vector element-wise ceiling value.
%f = math.ceil %g : vector<4xf32>
// Tensor element-wise ceiling value.
%x = math.ceil %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// CopySignOp
//===----------------------------------------------------------------------===//
def Math_CopySignOp : Math_FloatBinaryOp<"copysign"> {
let summary = "A copysign operation";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.copysign` ssa-use `,` ssa-use `:` type
```
The `copysign` returns a value with the magnitude of the first operand and
the sign of the second operand. It takes two operands and returns one
result of the same type. This type may be a float scalar type, a vector
whose element type is float, or a tensor of floats. It has no standard
attributes.
Example:
```mlir
// Scalar copysign value.
%a = math.copysign %b, %c : f64
// SIMD vector element-wise copysign value.
%f = math.copysign %g, %h : vector<4xf32>
// Tensor element-wise copysign value.
%x = math.copysign %y, %z : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// CosOp
//===----------------------------------------------------------------------===//
def Math_CosOp : Math_FloatUnaryOp<"cos"> {
let summary = "cosine of the specified value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.cos` ssa-use `:` type
```
The `cos` operation computes the cosine of a given value. It takes one
operand and returns one result of the same type. This type may be a float
scalar type, a vector whose element type is float, or a tensor of floats.
It has no standard attributes.
Example:
```mlir
// Scalar cosine value.
%a = math.cos %b : f64
// SIMD vector element-wise cosine value.
%f = math.cos %g : vector<4xf32>
// Tensor element-wise cosine value.
%x = math.cos %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// SinOp
//===----------------------------------------------------------------------===//
def Math_SinOp : Math_FloatUnaryOp<"sin"> {
let summary = "sine of the specified value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.sin` ssa-use `:` type
```
The `sin` operation computes the sine of a given value. It takes one
operand and returns one result of the same type. This type may be a float
scalar type, a vector whose element type is float, or a tensor of floats.
It has no standard attributes.
Example:
```mlir
// Scalar sine value.
%a = math.sin %b : f64
// SIMD vector element-wise sine value.
%f = math.sin %g : vector<4xf32>
// Tensor element-wise sine value.
%x = math.sin %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// ErfOp
//===----------------------------------------------------------------------===//
def Math_ErfOp : Math_FloatUnaryOp<"erf"> {
let summary = "error function of the specified value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.erf` ssa-use `:` type
```
The `erf` operation computes the error function. It takes one operand
and returns one result of the same type. This type may be a float scalar
type, a vector whose element type is float, or a tensor of floats. It has
no standard attributes.
Example:
```mlir
// Scalar error function value.
%a = math.erf %b : f64
// SIMD vector element-wise error function value.
%f = math.erf %g : vector<4xf32>
// Tensor element-wise error function value.
%x = math.erf %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// ExpOp
//===----------------------------------------------------------------------===//
def Math_ExpOp : Math_FloatUnaryOp<"exp"> {
let summary = "base-e exponential of the specified value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.exp` ssa-use `:` type
```
The `exp` operation takes one operand and returns one result of the same
type. This type may be a float scalar type, a vector whose element type is
float, or a tensor of floats. It has no standard attributes.
Example:
```mlir
// Scalar natural exponential.
%a = math.exp %b : f64
// SIMD vector element-wise natural exponential.
%f = math.exp %g : vector<4xf32>
// Tensor element-wise natural exponential.
%x = math.exp %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// Exp2Op
//===----------------------------------------------------------------------===//
def Math_Exp2Op : Math_FloatUnaryOp<"exp2"> {
let summary = "base-2 exponential of the specified value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.exp2` ssa-use `:` type
```
The `exp` operation takes one operand and returns one result of the same
type. This type may be a float scalar type, a vector whose element type is
float, or a tensor of floats. It has no standard attributes.
Example:
```mlir
// Scalar natural exponential.
%a = math.exp2 %b : f64
// SIMD vector element-wise natural exponential.
%f = math.exp2 %g : vector<4xf32>
// Tensor element-wise natural exponential.
%x = math.exp2 %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// ExpM1Op
//===----------------------------------------------------------------------===//
def Math_ExpM1Op : Math_FloatUnaryOp<"expm1"> {
let summary = "base-e exponential of the specified value minus 1";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.expm1` ssa-use `:` type
```
expm1(x) := exp(x) - 1
The `expm1` operation takes one operand and returns one result of the same
type. This type may be a float scalar type, a vector whose element type is
float, or a tensor of floats. It has no standard attributes.
Example:
```mlir
// Scalar natural exponential minus 1.
%a = math.expm1 %b : f64
// SIMD vector element-wise natural exponential minus 1.
%f = math.expm1 %g : vector<4xf32>
// Tensor element-wise natural exponential minus 1.
%x = math.expm1 %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// FloorOp
//===----------------------------------------------------------------------===//
def Math_FloorOp : Math_FloatUnaryOp<"floor"> {
let summary = "floor of the specified value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.floor` ssa-use `:` type
```
The `floor` operation computes the floor of a given value. It takes one
operand and returns one result of the same type. This type may be a float
scalar type, a vector whose element type is float, or a tensor of floats.
It has no standard attributes.
Example:
```mlir
// Scalar floor value.
%a = math.floor %b : f64
// SIMD vector element-wise floor value.
%f = math.floor %g : vector<4xf32>
// Tensor element-wise floor value.
%x = math.floor %y : tensor<4x?xf8>
```
}];
}
//===----------------------------------------------------------------------===//
// FmaOp
//===----------------------------------------------------------------------===//
def Math_FmaOp : Math_FloatTernaryOp<"fma"> {
let summary = "floating point fused multipy-add operation";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.fma` ssa-use `,` ssa-use `,` ssa-use `:` type
```
The `fma` operation takes three operands and returns one result, each of
these is required to be the same type. This type may be a floating point
scalar type, a vector whose element type is a floating point type, or a
floating point tensor.
Example:
```mlir
// Scalar fused multiply-add: d = a*b + c
%d = math.fma %a, %b, %c : f64
// SIMD vector fused multiply-add, e.g. for Intel SSE.
%i = math.fma %f, %g, %h : vector<4xf32>
// Tensor fused multiply-add.
%w = math.fma %x, %y, %z : tensor<4x?xbf16>
```
The semantics of the operation correspond to those of the `llvm.fma`
[intrinsic](https://llvm.org/docs/LangRef.html#llvm-fma-intrinsic). In the
particular case of lowering to LLVM, this is guaranteed to lower
to the `llvm.fma.*` intrinsic.
}];
}
//===----------------------------------------------------------------------===//
// LogOp
//===----------------------------------------------------------------------===//
def Math_LogOp : Math_FloatUnaryOp<"log"> {
let summary = "base-e logarithm of the specified value";
let description = [{
Computes the base-e logarithm of the given value. It takes one operand and
returns one result of the same type.
Example:
```mlir
%y = math.log %x : f64
```
}];
}
//===----------------------------------------------------------------------===//
// Log10Op
//===----------------------------------------------------------------------===//
def Math_Log10Op : Math_FloatUnaryOp<"log10"> {
let summary = "base-10 logarithm of the specified value";
let description = [{
Computes the base-10 logarithm of the given value. It takes one operand and
returns one result of the same type.
Example:
```mlir
%y = math.log10 %x : f64
```
}];
}
//===----------------------------------------------------------------------===//
// Log1pOp
//===----------------------------------------------------------------------===//
def Math_Log1pOp : Math_FloatUnaryOp<"log1p"> {
let summary = "Computes the natural logarithm of one plus the given value";
let description = [{
Computes the base-e logarithm of one plus the given value. It takes one
operand and returns one result of the same type.
log1p(x) := log(1 + x)
Example:
```mlir
%y = math.log1p %x : f64
```
}];
}
//===----------------------------------------------------------------------===//
// Log2Op
//===----------------------------------------------------------------------===//
def Math_Log2Op : Math_FloatUnaryOp<"log2"> {
let summary = "base-2 logarithm of the specified value";
let description = [{
Computes the base-2 logarithm of the given value. It takes one operand and
returns one result of the same type.
Example:
```mlir
%y = math.log2 %x : f64
```
}];
}
//===----------------------------------------------------------------------===//
// PowFOp
//===----------------------------------------------------------------------===//
def Math_PowFOp : Math_FloatBinaryOp<"powf"> {
let summary = "floating point raised to the power of operation";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `math.powf` ssa-use `,` ssa-use `:` type
```
The `powf` operation takes two operands and returns one result, each of
these is required to be the same type. This type may be a floating point
scalar type, a vector whose element type is a floating point type, or a
floating point tensor.
Example:
```mlir
// Scalar exponentiation.
%a = math.powf %b, %c : f64
// SIMD pointwise vector exponentiation
%f = math.powf %g, %h : vector<4xf32>
// Tensor pointwise exponentiation.
%x = math.powf %y, %z : tensor<4x?xbf16>
```
}];
}
//===----------------------------------------------------------------------===//
// RsqrtOp
//===----------------------------------------------------------------------===//
def Math_RsqrtOp : Math_FloatUnaryOp<"rsqrt"> {
let summary = "reciprocal of sqrt (1 / sqrt of the specified value)";
let description = [{
The `rsqrt` operation computes the reciprocal of the square root. It takes
one operand and returns one result of the same type. This type may be a
float scalar type, a vector whose element type is float, or a tensor of
floats. It has no standard attributes.
}];
}
//===----------------------------------------------------------------------===//
// SqrtOp
//===----------------------------------------------------------------------===//
def Math_SqrtOp : Math_FloatUnaryOp<"sqrt"> {
let summary = "sqrt of the specified value";
let description = [{
The `sqrt` operation computes the square root. It takes one operand and
returns one result of the same type. This type may be a float scalar type, a
vector whose element type is float, or a tensor of floats. It has no standard
attributes.
Example:
```mlir
// Scalar square root value.
%a = math.sqrt %b : f64
// SIMD vector element-wise square root value.
%f = math.sqrt %g : vector<4xf32>
// Tensor element-wise square root value.
%x = math.sqrt %y : tensor<4x?xf32>
```
}];
}
//===----------------------------------------------------------------------===//
// TanhOp
//===----------------------------------------------------------------------===//
def Math_TanhOp : Math_FloatUnaryOp<"tanh"> {
let summary = "hyperbolic tangent of the specified value";
let description = [{
Syntax:
```
operation ::= ssa-id `=` `std.tanh` ssa-use `:` type
```
The `tanh` operation computes the hyperbolic tangent. It takes one operand
and returns one result of the same type. This type may be a float scalar
type, a vector whose element type is float, or a tensor of floats. It has
no standard attributes.
Example:
```mlir
// Scalar hyperbolic tangent value.
%a = math.tanh %b : f64
// SIMD vector element-wise hyperbolic tangent value.
%f = math.tanh %g : vector<4xf32>
// Tensor element-wise hyperbolic tangent value.
%x = math.tanh %y : tensor<4x?xf8>
```
}];
}
#endif // MATH_OPS