1// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s
2
3//===----------------------------------------------------------------------===//
4// spv.LogicalEqual
5//===----------------------------------------------------------------------===//
6
7// CHECK-LABEL: @logical_equal_scalar
8spv.func @logical_equal_scalar(%arg0: i1, %arg1: i1) "None" {
9  // CHECK: llvm.icmp "eq" %{{.*}}, %{{.*}} : !llvm.i1
10  %0 = spv.LogicalEqual %arg0, %arg0 : i1
11  spv.Return
12}
13
14// CHECK-LABEL: @logical_equal_vector
15spv.func @logical_equal_vector(%arg0: vector<4xi1>, %arg1: vector<4xi1>) "None" {
16  // CHECK: llvm.icmp "eq" %{{.*}}, %{{.*}} : !llvm.vec<4 x i1>
17  %0 = spv.LogicalEqual %arg0, %arg0 : vector<4xi1>
18  spv.Return
19}
20
21//===----------------------------------------------------------------------===//
22// spv.LogicalNotEqual
23//===----------------------------------------------------------------------===//
24
25// CHECK-LABEL: @logical_not_equal_scalar
26spv.func @logical_not_equal_scalar(%arg0: i1, %arg1: i1) "None" {
27  // CHECK: llvm.icmp "ne" %{{.*}}, %{{.*}} : !llvm.i1
28  %0 = spv.LogicalNotEqual %arg0, %arg0 : i1
29  spv.Return
30}
31
32// CHECK-LABEL: @logical_not_equal_vector
33spv.func @logical_not_equal_vector(%arg0: vector<4xi1>, %arg1: vector<4xi1>) "None" {
34  // CHECK: llvm.icmp "ne" %{{.*}}, %{{.*}} : !llvm.vec<4 x i1>
35  %0 = spv.LogicalNotEqual %arg0, %arg0 : vector<4xi1>
36  spv.Return
37}
38
39//===----------------------------------------------------------------------===//
40// spv.LogicalNot
41//===----------------------------------------------------------------------===//
42
43// CHECK-LABEL: @logical_not_scalar
44spv.func @logical_not_scalar(%arg0: i1) "None" {
45  // CHECK: %[[CONST:.*]] = llvm.mlir.constant(true) : !llvm.i1
46  // CHECK: llvm.xor %{{.*}}, %[[CONST]] : !llvm.i1
47  %0 = spv.LogicalNot %arg0 : i1
48  spv.Return
49}
50
51// CHECK-LABEL: @logical_not_vector
52spv.func @logical_not_vector(%arg0: vector<4xi1>) "None" {
53  // CHECK: %[[CONST:.*]] = llvm.mlir.constant(dense<true> : vector<4xi1>) : !llvm.vec<4 x i1>
54  // CHECK: llvm.xor %{{.*}}, %[[CONST]] : !llvm.vec<4 x i1>
55  %0 = spv.LogicalNot %arg0 : vector<4xi1>
56  spv.Return
57}
58
59//===----------------------------------------------------------------------===//
60// spv.LogicalAnd
61//===----------------------------------------------------------------------===//
62
63// CHECK-LABEL: @logical_and_scalar
64spv.func @logical_and_scalar(%arg0: i1, %arg1: i1) "None" {
65  // CHECK: llvm.and %{{.*}}, %{{.*}} : !llvm.i1
66  %0 = spv.LogicalAnd %arg0, %arg0 : i1
67  spv.Return
68}
69
70// CHECK-LABEL: @logical_and_vector
71spv.func @logical_and_vector(%arg0: vector<4xi1>, %arg1: vector<4xi1>) "None" {
72  // CHECK: llvm.and %{{.*}}, %{{.*}} : !llvm.vec<4 x i1>
73  %0 = spv.LogicalAnd %arg0, %arg0 : vector<4xi1>
74  spv.Return
75}
76
77//===----------------------------------------------------------------------===//
78// spv.LogicalOr
79//===----------------------------------------------------------------------===//
80
81// CHECK-LABEL: @logical_or_scalar
82spv.func @logical_or_scalar(%arg0: i1, %arg1: i1) "None" {
83  // CHECK: llvm.or %{{.*}}, %{{.*}} : !llvm.i1
84  %0 = spv.LogicalOr %arg0, %arg0 : i1
85  spv.Return
86}
87
88// CHECK-LABEL: @logical_or_vector
89spv.func @logical_or_vector(%arg0: vector<4xi1>, %arg1: vector<4xi1>) "None" {
90  // CHECK: llvm.or %{{.*}}, %{{.*}} : !llvm.vec<4 x i1>
91  %0 = spv.LogicalOr %arg0, %arg0 : vector<4xi1>
92  spv.Return
93}
94