-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[mlir][spirv] Add more CL math ops #72995
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
tan atan atanh sinh cosh asin asinh acos acosh atan2
@llvm/pr-subscribers-mlir-spirv @llvm/pr-subscribers-mlir Author: Ivan Butygin (Hardcode84) Changestan Full diff: https://github.com/llvm/llvm-project/pull/72995.diff 2 Files Affected:
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
+}
+
|
kuhar
approved these changes
Nov 21, 2023
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
tan
atan
atanh
sinh
cosh
asin
asinh
acos
acosh
atan2