[Mlir-commits] [mlir] [mlir][spirv] Add more CL math ops (PR #72995)
Ivan Butygin
llvmlistbot at llvm.org
Tue Nov 21 06:06:45 PST 2023
https://github.com/Hardcode84 created https://github.com/llvm/llvm-project/pull/72995
tan
atan
atanh
sinh
cosh
asin
asinh
acos
acosh
atan2
>From a72e0e25721e58d5a7a005b89d38e17ba7872d70 Mon Sep 17 00:00:00 2001
From: Ivan Butygin <ivan.butygin at gmail.com>
Date: Tue, 21 Nov 2023 15:04:02 +0100
Subject: [PATCH] [mlir][spirv] Add more CL math ops
tan
atan
atanh
sinh
cosh
asin
asinh
acos
acosh
atan2
---
.../mlir/Dialect/SPIRV/IR/SPIRVCLOps.td | 333 +++++++++++++++++-
mlir/test/Dialect/SPIRV/IR/ocl-ops.mlir | 160 +++++++++
2 files changed, 483 insertions(+), 10 deletions(-)
diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td
index 026f59b2afd8e24..124d828c2c26d77 100644
--- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td
@@ -113,31 +113,223 @@ class SPIRV_CLTernaryArithmeticOp<string mnemonic, int opcode, Type type,
// -----
-def SPIRV_CLMixOp : SPIRV_CLTernaryArithmeticOp<"mix", 99, SPIRV_Float> {
- let summary = "Returns the linear blend of x & y implemented as: x + (y - x) * a";
+def SPIRV_CLAtan2Op : SPIRV_CLBinaryArithmeticOp<"atan2", 7, SPIRV_Float > {
+ let summary = "Compute the arc tangent of y / x.";
let description = [{
- Result Type, x, y and a must be floating-point or vector(2,3,4,8,16) of
+ Result is an angle in radians.
+
+ Result Type, y and x must be floating-point or vector(2,3,4,8,16) of
floating-point values.
All of the operands, including the Result Type operand, must be of the
same type.
- Note: This instruction can be implemented using contractions such as mad
- or fma.
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ atan2-op ::= ssa-id `=` `spirv.CL.atan2` ssa-use `:`
+ float-scalar-vector-type
+ ```
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.atan2 %0, %1 : f32
+ %3 = spirv.CL.atan2 %0, %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
+def SPIRV_CLAcosOp : SPIRV_CLUnaryArithmeticOp<"acos", 0, SPIRV_Float > {
+ let summary = "Compute the arc cosine of x.";
+
+ let description = [{
+ Result is an angle in radians.
+
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
<!-- End of AutoGen section -->
```
- mix-op ::= ssa-id `=` `spirv.CL.mix` ssa-use, ssa-use, ssa-use `:`
- float-scalar-vector-type
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ acos-op ::= ssa-id `=` `spirv.CL.acos` ssa-use `:`
+ float-scalar-vector-type
```
#### Example:
```mlir
- %0 = spirv.CL.mix %a, %b, %c : f32
- %1 = spirv.CL.mix %a, %b, %c : vector<3xf16>
+ %2 = spirv.CL.acos %0 : f32
+ %3 = spirv.CL.acos %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
+def SPIRV_CLAcoshOp : SPIRV_CLUnaryArithmeticOp<"acosh", 1, SPIRV_Float > {
+ let summary = "Compute the inverse hyperbolic cosine of x .";
+
+ let description = [{
+ Result is an angle in radians.
+
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ acosh-op ::= ssa-id `=` `spirv.CL.acosh` ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.acosh %0 : f32
+ %3 = spirv.CL.acosh %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
+def SPIRV_CLAsinOp : SPIRV_CLUnaryArithmeticOp<"asin", 3, SPIRV_Float > {
+ let summary = "Compute the arc sine of x.";
+
+ let description = [{
+ Result is an angle in radians.
+
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ asin-op ::= ssa-id `=` `spirv.CL.asin` ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.asin %0 : f32
+ %3 = spirv.CL.asin %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
+def SPIRV_CLAsinhOp : SPIRV_CLUnaryArithmeticOp<"asinh", 4, SPIRV_Float > {
+ let summary = "Compute the inverse hyperbolic sine of x.";
+
+ let description = [{
+ Result is an angle in radians.
+
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ asinh-op ::= ssa-id `=` `spirv.CL.asinh` ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.asinh %0 : f32
+ %3 = spirv.CL.asinh %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
+def SPIRV_CLAtanOp : SPIRV_CLUnaryArithmeticOp<"atan", 6, SPIRV_Float > {
+ let summary = "Compute the arc tangent of x.";
+
+ let description = [{
+ Result is an angle in radians.
+
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ atan-op ::= ssa-id `=` `spirv.CL.atan` ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.atan %0 : f32
+ %3 = spirv.CL.atan %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
+def SPIRV_CLAtanhOp : SPIRV_CLUnaryArithmeticOp<"atanh", 8, SPIRV_Float > {
+ let summary = "Compute the hyperbolic arc tangent of x.";
+
+ let description = [{
+ Result is an angle in radians.
+
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ atanh-op ::= ssa-id `=` `spirv.CL.atanh` ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.atanh %0 : f32
+ %3 = spirv.CL.atanh %1 : vector<4xf16>
```
}];
}
@@ -207,6 +399,36 @@ def SPIRV_CLCosOp : SPIRV_CLUnaryArithmeticOp<"cos", 14, SPIRV_Float> {
// -----
+def SPIRV_CLCoshOp : SPIRV_CLUnaryArithmeticOp<"cosh", 15, SPIRV_Float > {
+ let summary = "Compute the hyperbolic cosine of x radians.";
+
+ let description = [{
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ cosh-op ::= ssa-id `=` `spirv.CL.cosh` ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.cosh %0 : f32
+ %3 = spirv.CL.cosh %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
def SPIRV_CLErfOp : SPIRV_CLUnaryArithmeticOp<"erf", 18, SPIRV_Float> {
let summary = [{
Error function of x encountered in integrating the normal distribution.
@@ -386,7 +608,7 @@ def SPIRV_CLFloorOp : SPIRV_CLUnaryArithmeticOp<"floor", 25, SPIRV_Float> {
```mlir
%2 = spirv.CL.floor %0 : f32
- %3 = spirv.CL.ceifloorl %1 : vector<3xf16>
+ %3 = spirv.CL.floor %1 : vector<3xf16>
```
}];
}
@@ -456,6 +678,37 @@ def SPIRV_CLLogOp : SPIRV_CLUnaryArithmeticOp<"log", 37, SPIRV_Float> {
// -----
+def SPIRV_CLMixOp : SPIRV_CLTernaryArithmeticOp<"mix", 99, SPIRV_Float> {
+ let summary = "Returns the linear blend of x & y implemented as: x + (y - x) * a";
+
+ let description = [{
+ Result Type, x, y and a must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ Note: This instruction can be implemented using contractions such as mad
+ or fma.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ mix-op ::= ssa-id `=` `spirv.CL.mix` ssa-use, ssa-use, ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %0 = spirv.CL.mix %a, %b, %c : f32
+ %1 = spirv.CL.mix %a, %b, %c : vector<3xf16>
+ ```
+ }];
+}
+
+// -----
+
def SPIRV_CLPowOp : SPIRV_CLBinaryArithmeticOp<"pow", 48, SPIRV_Float> {
let summary = "Compute x to the power y.";
@@ -696,6 +949,36 @@ def SPIRV_CLSinOp : SPIRV_CLUnaryArithmeticOp<"sin", 57, SPIRV_Float> {
// -----
+def SPIRV_CLSinhOp : SPIRV_CLUnaryArithmeticOp<"sinh", 59, SPIRV_Float > {
+ let summary = "Compute hyperbolic sine of x radians.";
+
+ let description = [{
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ sinh-op ::= ssa-id `=` `spirv.CL.sinh` ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.sinh %0 : f32
+ %3 = spirv.CL.sinh %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
def SPIRV_CLSqrtOp : SPIRV_CLUnaryArithmeticOp<"sqrt", 61, SPIRV_Float> {
let summary = "Compute square root of x.";
@@ -726,6 +1009,36 @@ def SPIRV_CLSqrtOp : SPIRV_CLUnaryArithmeticOp<"sqrt", 61, SPIRV_Float> {
// -----
+def SPIRV_CLTanOp : SPIRV_CLUnaryArithmeticOp<"tan", 62, SPIRV_Float > {
+ let summary = "Compute tangent of x radians.";
+
+ let description = [{
+ Result Type and x must be floating-point or vector(2,3,4,8,16) of
+ floating-point values.
+
+ All of the operands, including the Result Type operand, must be of the
+ same type.
+
+ <!-- End of AutoGen section -->
+
+ ```
+ float-scalar-vector-type ::= float-type |
+ `vector<` integer-literal `x` float-type `>`
+ tan-op ::= ssa-id `=` `spirv.CL.tan` ssa-use `:`
+ float-scalar-vector-type
+ ```
+
+ #### Example:
+
+ ```mlir
+ %2 = spirv.CL.tan %0 : f32
+ %3 = spirv.CL.tan %1 : vector<4xf16>
+ ```
+ }];
+}
+
+// -----
+
def SPIRV_CLTanhOp : SPIRV_CLUnaryArithmeticOp<"tanh", 63, SPIRV_Float> {
let summary = "Compute hyperbolic tangent of x radians.";
diff --git a/mlir/test/Dialect/SPIRV/IR/ocl-ops.mlir b/mlir/test/Dialect/SPIRV/IR/ocl-ops.mlir
index f4e3a83e39f2479..81ba471d3f51e3d 100644
--- a/mlir/test/Dialect/SPIRV/IR/ocl-ops.mlir
+++ b/mlir/test/Dialect/SPIRV/IR/ocl-ops.mlir
@@ -280,3 +280,163 @@ func.func @printf(%arg0 : !spirv.ptr<i8, UniformConstant>, %arg1 : i32, %arg2 :
return %0 : i32
}
+// -----
+
+func.func @tan(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.tan {{%.*}} : f32
+ %2 = spirv.CL.tan %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @tan(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.tan {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.tan %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @atan(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.atan {{%.*}} : f32
+ %2 = spirv.CL.atan %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @atan(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.atan {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.atan %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @atanh(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.atanh {{%.*}} : f32
+ %2 = spirv.CL.atanh %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @atanh(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.atanh {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.atanh %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @sinh(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.sinh {{%.*}} : f32
+ %2 = spirv.CL.sinh %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @sinh(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.sinh {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.sinh %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @cosh(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.cosh {{%.*}} : f32
+ %2 = spirv.CL.cosh %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @cosh(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.cosh {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.cosh %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @asin(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.asin {{%.*}} : f32
+ %2 = spirv.CL.asin %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @asin(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.asin {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.asin %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @asinh(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.asinh {{%.*}} : f32
+ %2 = spirv.CL.asinh %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @asinh(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.asinh {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.asinh %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @acos(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.acos {{%.*}} : f32
+ %2 = spirv.CL.acos %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @acos(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.acos {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.acos %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @acosh(%arg0 : f32) -> () {
+ // CHECK: spirv.CL.acosh {{%.*}} : f32
+ %2 = spirv.CL.acosh %arg0 : f32
+ return
+}
+
+// -----
+
+func.func @acosh(%arg0 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.acosh {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.acosh %arg0 : vector<4xf16>
+ return
+}
+
+// -----
+
+func.func @atan2(%arg0 : f32, %arg1 : f32) -> () {
+ // CHECK: spirv.CL.atan2 {{%.*}}, {{%.*}} : f32
+ %2 = spirv.CL.atan2 %arg0, %arg1 : f32
+ return
+}
+
+// -----
+
+func.func @atan2(%arg0 : vector<4xf16>, %arg1 : vector<4xf16>) -> () {
+ // CHECK: spirv.CL.atan2 {{%.*}}, {{%.*}} : vector<4xf16>
+ %2 = spirv.CL.atan2 %arg0, %arg1 : vector<4xf16>
+ return
+}
+
More information about the Mlir-commits
mailing list