diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td index feae817c9b4ef..4c7186077fae0 100644 --- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td +++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td @@ -838,6 +838,36 @@ def SPIRV_GLAtanhOp : SPIRV_GLUnaryArithmeticOp<"Atanh", 24, SPIRV_Float16or32> // ----- +def SPIRV_GLLog2Op : SPIRV_GLUnaryArithmeticOp<"Log2", 30, SPIRV_Float16or32> { + let summary = "Result is the base-2 logarithm of x"; + + let description = [{ + Result is the base-2 logarithm of x, i.e., the value y which satisfies the + equation x = 2**y. The resulting value is NaN if x < 0. Moreover: + + ``` + log(Inf) = Inf + log(1.0) = +0 + log(±0) = -Inf + ``` + + The operand x must be a scalar or vector whose component type is 16-bit or + 32-bit floating-point. + + Result Type and the type of x must be the same type. Results are computed + per component. + + #### Example: + + ```mlir + %2 = spirv.GL.Log2 %0 : f32 + %3 = spirv.GL.Log2 %1 : vector<3xf16> + ``` + }]; +} + +// ----- + def SPIRV_GLFClampOp : SPIRV_GLTernaryArithmeticOp<"FClamp", 43, SPIRV_Float> { let summary = "Clamp x between min and max values."; diff --git a/mlir/test/Dialect/SPIRV/IR/gl-ops.mlir b/mlir/test/Dialect/SPIRV/IR/gl-ops.mlir index 680a7e12b1082..f238336f14a4d 100644 --- a/mlir/test/Dialect/SPIRV/IR/gl-ops.mlir +++ b/mlir/test/Dialect/SPIRV/IR/gl-ops.mlir @@ -737,3 +737,29 @@ func.func @fract_invalid_type(%arg0 : i32) { %0 = spirv.GL.Fract %arg0 : i32 return } + +// ----- + +//===----------------------------------------------------------------------===// +// spirv.GL.Log2 +//===----------------------------------------------------------------------===// + +func.func @log2(%arg0 : f32) -> () { + // CHECK: spirv.GL.Log2 {{%.*}} : f32 + %0 = spirv.GL.Log2 %arg0 : f32 + return +} + +func.func @log2vec(%arg0 : vector<3xf16>) -> () { + // CHECK: spirv.GL.Log2 {{%.*}} : vector<3xf16> + %0 = spirv.GL.Log2 %arg0 : vector<3xf16> + return +} + +// ----- + +func.func @log2_invalid_type(%arg0 : i32) -> () { + // expected-error @+1 {{op operand #0 must be 16/32-bit float or vector of 16/32-bit float values}} + %0 = spirv.GL.Log2 %arg0 : i32 + return +} diff --git a/mlir/test/Target/SPIRV/gl-ops.mlir b/mlir/test/Target/SPIRV/gl-ops.mlir index 28e5a1fd72ec5..64592a4d5079b 100644 --- a/mlir/test/Target/SPIRV/gl-ops.mlir +++ b/mlir/test/Target/SPIRV/gl-ops.mlir @@ -40,6 +40,8 @@ spirv.module Logical GLSL450 requires #spirv.vce { %18 = spirv.GL.Acosh %arg0 : f32 // CHECK: {{%.*}} = spirv.GL.Atanh {{%.*}} : f32 %19 = spirv.GL.Atanh %arg0 : f32 + // CHECK: {{%.*}} = spirv.GL.Log2 {{%.*}} : f32 + %20 = spirv.GL.Log2 %arg0 : f32 spirv.Return }