Skip to content

Commit 2c20bc5

Browse files
authored
[mlir][spirv] Add definitions for GL FindILsb and FindSMsb (#143916)
Adds SPIRV GL FindILsb and FindSMsb instructions which correspond to GL instruction numbers 73 and 74.
1 parent e65131a commit 2c20bc5

File tree

3 files changed

+118
-2
lines changed

3 files changed

+118
-2
lines changed

mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,41 @@ def SPIRV_GLReflectOp : SPIRV_GLBinaryArithmeticOp<"Reflect", 71, SPIRV_Float> {
12741274

12751275
// ----
12761276

1277+
def SPIRV_GLFindILsbOp : SPIRV_GLUnaryArithmeticOp<"FindILsb", 73, SPIRV_Integer> {
1278+
let summary = "Integer least-significant bit";
1279+
1280+
let description = [{
1281+
Results in the bit number of the least-significant 1-bit in the binary
1282+
representation of Value. If Value is 0, the result is -1.
1283+
1284+
Result Type and the type of Value must both be integer scalar or
1285+
integer vector types. Result Type and operand types must have the
1286+
same number of components with the same component width. Results are
1287+
computed per component.
1288+
}];
1289+
}
1290+
1291+
// ----
1292+
1293+
def SPIRV_GLFindSMsbOp : SPIRV_GLUnaryArithmeticOp<"FindSMsb", 74, SPIRV_Int32> {
1294+
let summary = "Signed-integer most-significant bit, with Value interpreted as a signed integer";
1295+
1296+
let description = [{
1297+
For positive numbers, the result will be the bit number of the most significant
1298+
1-bit. For negative numbers, the result will be the bit number of the most
1299+
significant 0-bit. For a Value of 0 or -1, the result is -1.
1300+
1301+
Result Type and the type of Value must both be integer scalar or
1302+
integer vector types. Result Type and operand types must have the
1303+
same number of components with the same component width. Results are
1304+
computed per component.
1305+
1306+
This instruction is currently limited to 32-bit width components.
1307+
}];
1308+
}
1309+
1310+
// ----
1311+
12771312
def SPIRV_GLFindUMsbOp : SPIRV_GLUnaryArithmeticOp<"FindUMsb", 75, SPIRV_Int32> {
12781313
let summary = "Unsigned-integer most-significant bit";
12791314

mlir/test/Dialect/SPIRV/IR/gl-ops.mlir

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,71 @@ func.func @fmix_vector(%arg0 : vector<3xf32>, %arg1 : vector<3xf32>, %arg2 : vec
567567
// -----
568568

569569
//===----------------------------------------------------------------------===//
570-
// spirv.GL.Exp
570+
// spirv.GL.FindILsb
571+
//===----------------------------------------------------------------------===//
572+
573+
func.func @findimsb_scalar_i32(%arg0 : i32) -> () {
574+
// CHECK: spirv.GL.FindILsb {{%.*}} : i32
575+
%2 = spirv.GL.FindILsb %arg0 : i32
576+
return
577+
}
578+
579+
func.func @findimsb_vector_i32(%arg0 : vector<3xi32>) -> () {
580+
// CHECK: spirv.GL.FindILsb {{%.*}} : vector<3xi32>
581+
%2 = spirv.GL.FindILsb %arg0 : vector<3xi32>
582+
return
583+
}
584+
585+
func.func @findimsb_scalar_i16(%arg0 : i16) -> () {
586+
// CHECK: spirv.GL.FindILsb {{%.*}} : i16
587+
%2 = spirv.GL.FindILsb %arg0 : i16
588+
return
589+
}
590+
591+
func.func @findimsb_vector_i64(%arg0 : vector<3xi64>) -> () {
592+
// CHECK: spirv.GL.FindILsb {{%.*}} : vector<3xi64>
593+
%2 = spirv.GL.FindILsb %arg0 : vector<3xi64>
594+
return
595+
}
596+
597+
// -----
598+
599+
func.func @findimsb_error_scalar_float(%arg0 : f32) -> () {
600+
// expected-error @+1 {{operand #0 must be 8/16/32/64-bit integer or vector of 8/16/32/64-bit integer values of length 2/3/4/8/1}}
601+
%2 = spirv.GL.FindILsb %arg0 : f32
602+
return
603+
}
604+
605+
// -----
606+
607+
//===----------------------------------------------------------------------===//
608+
// spirv.GL.FindSMsb
609+
//===----------------------------------------------------------------------===//
610+
611+
func.func @findsmsb_scalar(%arg0 : i32) -> () {
612+
// CHECK: spirv.GL.FindSMsb {{%.*}} : i32
613+
%2 = spirv.GL.FindSMsb %arg0 : i32
614+
return
615+
}
616+
617+
func.func @findsmsb_vector(%arg0 : vector<3xi32>) -> () {
618+
// CHECK: spirv.GL.FindSMsb {{%.*}} : vector<3xi32>
619+
%2 = spirv.GL.FindSMsb %arg0 : vector<3xi32>
620+
return
621+
}
622+
623+
// -----
624+
625+
func.func @findsmsb_error_scalar_i64(%arg0 : i64) -> () {
626+
// expected-error @+1 {{operand #0 must be Int32 or vector of Int32}}
627+
%2 = spirv.GL.FindSMsb %arg0 : i64
628+
return
629+
}
630+
631+
// -----
632+
633+
//===----------------------------------------------------------------------===//
634+
// spirv.GL.FindUMsb
571635
//===----------------------------------------------------------------------===//
572636

573637
func.func @findumsb(%arg0 : i32) -> () {

mlir/test/Target/SPIRV/gl-ops.mlir

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,24 @@ spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
9090
spirv.Return
9191
}
9292

93+
spirv.func @findilsb(%arg0 : i32) "None" {
94+
// CHECK: spirv.GL.FindILsb {{%.*}} : i32
95+
%2 = spirv.GL.FindILsb %arg0 : i32
96+
spirv.Return
97+
}
98+
spirv.func @findsmsb(%arg0 : i32) "None" {
99+
// CHECK: spirv.GL.FindSMsb {{%.*}} : i32
100+
%2 = spirv.GL.FindSMsb %arg0 : i32
101+
spirv.Return
102+
}
103+
93104
spirv.func @findumsb(%arg0 : i32) "None" {
94105
// CHECK: spirv.GL.FindUMsb {{%.*}} : i32
95106
%2 = spirv.GL.FindUMsb %arg0 : i32
96107
spirv.Return
97108
}
98109

99-
spirv.func @vector(%arg0 : f32, %arg1 : vector<3xf32>, %arg2 : vector<3xf32>) "None" {
110+
spirv.func @vector(%arg0 : f32, %arg1 : vector<3xf32>, %arg2 : vector<3xf32>, %arg3: vector<3xi32>) "None" {
100111
// CHECK: {{%.*}} = spirv.GL.Cross {{%.*}}, {{%.*}} : vector<3xf32>
101112
%0 = spirv.GL.Cross %arg1, %arg2 : vector<3xf32>
102113
// CHECK: {{%.*}} = spirv.GL.Normalize {{%.*}} : f32
@@ -111,6 +122,12 @@ spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
111122
%5 = spirv.GL.Distance %arg0, %arg0 : f32, f32 -> f32
112123
// CHECK: {{%.*}} = spirv.GL.Distance {{%.*}}, {{%.*}} : vector<3xf32>, vector<3xf32> -> f32
113124
%6 = spirv.GL.Distance %arg1, %arg2 : vector<3xf32>, vector<3xf32> -> f32
125+
// CHECK: {{%.*}} = spirv.GL.FindILsb {{%.*}} : vector<3xi32>
126+
%7 = spirv.GL.FindILsb %arg3 : vector<3xi32>
127+
// CHECK: {{%.*}} = spirv.GL.FindSMsb {{%.*}} : vector<3xi32>
128+
%8 = spirv.GL.FindSMsb %arg3 : vector<3xi32>
129+
// CHECK: {{%.*}} = spirv.GL.FindUMsb {{%.*}} : vector<3xi32>
130+
%9 = spirv.GL.FindUMsb %arg3 : vector<3xi32>
114131
spirv.Return
115132
}
116133

0 commit comments

Comments
 (0)