@@ -110,6 +110,154 @@ func.func @arith_index(%arg0: i32, %arg1: i32) {
110
110
111
111
// -----
112
112
113
+ // CHECK-LABEL: arith_bitwise
114
+ // CHECK-SAME: %[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32
115
+ func.func @arith_bitwise (%arg0: i32 , %arg1: i32 ) {
116
+ // CHECK: %[[C1:[^ ]*]] = emitc.cast %[[ARG0]] : i32 to ui32
117
+ // CHECK: %[[C2:[^ ]*]] = emitc.cast %[[ARG1]] : i32 to ui32
118
+ // CHECK: %[[AND:[^ ]*]] = emitc.bitwise_and %[[C1]], %[[C2]] : (ui32, ui32) -> ui32
119
+ // CHECK: %[[C3:[^ ]*]] = emitc.cast %[[AND]] : ui32 to i32
120
+ %5 = arith.andi %arg0 , %arg1 : i32
121
+ // CHECK: %[[C1:[^ ]*]] = emitc.cast %[[ARG0]] : i32 to ui32
122
+ // CHECK: %[[C2:[^ ]*]] = emitc.cast %[[ARG1]] : i32 to ui32
123
+ // CHECK: %[[OR:[^ ]*]] = emitc.bitwise_or %[[C1]], %[[C2]] : (ui32, ui32) -> ui32
124
+ // CHECK: %[[C3:[^ ]*]] = emitc.cast %[[OR]] : ui32 to i32
125
+ %6 = arith.ori %arg0 , %arg1 : i32
126
+ // CHECK: %[[C1:[^ ]*]] = emitc.cast %[[ARG0]] : i32 to ui32
127
+ // CHECK: %[[C2:[^ ]*]] = emitc.cast %[[ARG1]] : i32 to ui32
128
+ // CHECK: %[[XOR:[^ ]*]] = emitc.bitwise_xor %[[C1]], %[[C2]] : (ui32, ui32) -> ui32
129
+ // CHECK: %[[C3:[^ ]*]] = emitc.cast %[[XOR]] : ui32 to i32
130
+ %7 = arith.xori %arg0 , %arg1 : i32
131
+
132
+ return
133
+ }
134
+
135
+ // -----
136
+
137
+ // CHECK-LABEL: arith_bitwise_bool
138
+ func.func @arith_bitwise_bool (%arg0: i1 , %arg1: i1 ) {
139
+ // CHECK: %[[AND:[^ ]*]] = emitc.bitwise_and %arg0, %arg1 : (i1, i1) -> i1
140
+ %5 = arith.andi %arg0 , %arg1 : i1
141
+ // CHECK: %[[OR:[^ ]*]] = emitc.bitwise_or %arg0, %arg1 : (i1, i1) -> i1
142
+ %6 = arith.ori %arg0 , %arg1 : i1
143
+ // CHECK: %[[xor:[^ ]*]] = emitc.bitwise_xor %arg0, %arg1 : (i1, i1) -> i1
144
+ %7 = arith.xori %arg0 , %arg1 : i1
145
+
146
+ return
147
+ }
148
+
149
+ // -----
150
+
151
+ // CHECK-LABEL: arith_shift_left
152
+ // CHECK-SAME: %[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32
153
+ func.func @arith_shift_left (%arg0: i32 , %arg1: i32 ) {
154
+ // CHECK-DAG: %[[C1:[^ ]*]] = emitc.cast %[[ARG0]] : i32 to ui32
155
+ // CHECK-DAG: %[[C2:[^ ]*]] = emitc.cast %[[ARG1]] : i32 to ui32
156
+ // CHECK-DAG: %[[SizeConstant:[^ ]*]] = "emitc.constant"{{.*}}value = 32
157
+ // CHECK-DAG: %[[CmpNoExcess:[^ ]*]] = emitc.cmp lt, %[[C2]], %[[SizeConstant]] : (ui32, ui32) -> i1
158
+ // CHECK-DAG: %[[Zero:[^ ]*]] = "emitc.constant"{{.*}}value = 0
159
+ // CHECK: %[[ShiftRes:[^ ]*]] = emitc.expression : ui32
160
+ // CHECK: %[[SHL:[^ ]*]] = emitc.bitwise_left_shift %[[C1]], %[[C2]] : (ui32, ui32) -> ui32
161
+ // CHECK: %[[Ternary:[^ ]*]] = emitc.conditional %[[CmpNoExcess]], %[[SHL]], %[[Zero]] : ui32
162
+ // CHECK: emitc.yield %[[Ternary]] : ui32
163
+ // CHECK: emitc.cast %[[ShiftRes]] : ui32 to i32
164
+ %1 = arith.shli %arg0 , %arg1 : i32
165
+ return
166
+ }
167
+
168
+ // -----
169
+
170
+ // CHECK-LABEL: arith_shift_right
171
+ // CHECK-SAME: %[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32
172
+ func.func @arith_shift_right (%arg0: i32 , %arg1: i32 ) {
173
+ // CHECK-DAG: %[[C1:[^ ]*]] = emitc.cast %[[ARG0]] : i32 to ui32
174
+ // CHECK-DAG: %[[C2:[^ ]*]] = emitc.cast %[[ARG1]] : i32 to ui32
175
+ // CHECK-DAG: %[[SizeConstant:[^ ]*]] = "emitc.constant"{{.*}}value = 32{{.*}}ui32
176
+ // CHECK-DAG: %[[CmpNoExcess:[^ ]*]] = emitc.cmp lt, %[[C2]], %[[SizeConstant]] : (ui32, ui32) -> i1
177
+ // CHECK-DAG: %[[Zero:[^ ]*]] = "emitc.constant"{{.*}}value = 0{{.*}}ui32
178
+ // CHECK: %[[ShiftRes:[^ ]*]] = emitc.expression : ui32
179
+ // CHECK: %[[SHR:[^ ]*]] = emitc.bitwise_right_shift %[[C1]], %[[C2]] : (ui32, ui32) -> ui32
180
+ // CHECK: %[[Ternary:[^ ]*]] = emitc.conditional %[[CmpNoExcess]], %[[SHR]], %[[Zero]] : ui32
181
+ // CHECK: emitc.yield %[[Ternary]] : ui32
182
+ // CHECK: emitc.cast %[[ShiftRes]] : ui32 to i32
183
+ %2 = arith.shrui %arg0 , %arg1 : i32
184
+
185
+ // CHECK-DAG: %[[SC2:[^ ]*]] = emitc.cast %[[ARG1]] : i32 to ui32
186
+ // CHECK-DAG: %[[SSizeConstant:[^ ]*]] = "emitc.constant"{{.*}}value = 32{{.*}}ui32
187
+ // CHECK-DAG: %[[SCmpNoExcess:[^ ]*]] = emitc.cmp lt, %[[SC2]], %[[SSizeConstant]] : (ui32, ui32) -> i1
188
+ // CHECK-DAG: %[[SZero:[^ ]*]] = "emitc.constant"{{.*}}value = 0{{.*}}i32
189
+ // CHECK: %[[SShiftRes:[^ ]*]] = emitc.expression : i32
190
+ // CHECK: %[[SHRSI:[^ ]*]] = emitc.bitwise_right_shift %[[ARG0]], %[[SC2]] : (i32, ui32) -> i32
191
+ // CHECK: %[[STernary:[^ ]*]] = emitc.conditional %[[SCmpNoExcess]], %[[SHRSI]], %[[SZero]] : i32
192
+ // CHECK: emitc.yield %[[STernary]] : i32
193
+ %3 = arith.shrsi %arg0 , %arg1 : i32
194
+
195
+ return
196
+ }
197
+
198
+ // -----
199
+
200
+ // CHECK-LABEL: arith_shift_left_index
201
+ // CHECK-SAME: %[[AMOUNT:.*]]: i32
202
+ func.func @arith_shift_left_index (%amount: i32 ) {
203
+ %cst0 = " arith.constant" () {value = 42 : index } : () -> (index )
204
+ %cast1 = arith.index_cast %amount : i32 to index
205
+ // CHECK-DAG: %[[C1:[^ ]*]] = "emitc.constant"(){{.*}}value = 42{{.*}}!emitc.size_t
206
+ // CHECK-DAG: %[[Cast1:[^ ]*]] = emitc.cast %[[AMOUNT]] : i32 to !emitc.ssize_t
207
+ // CHECK-DAG: %[[AmountIdx:[^ ]*]] = emitc.cast %[[Cast1]] : !emitc.ssize_t to !emitc.size_t
208
+ // CHECK-DAG: %[[Byte:[^ ]*]] = "emitc.constant"{{.*}}value = 8{{.*}}index
209
+ // CHECK-DAG: %[[SizeOf:[^ ]*]] = emitc.call_opaque "sizeof"(%[[Byte]]) : (!emitc.size_t) -> !emitc.size_t
210
+ // CHECK-DAG: %[[SizeConstant:[^ ]*]] = emitc.mul %[[Byte]], %[[SizeOf]] : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
211
+ // CHECK-DAG: %[[CmpNoExcess:[^ ]*]] = emitc.cmp lt, %[[AmountIdx]], %[[SizeConstant]] : (!emitc.size_t, !emitc.size_t) -> i1
212
+ // CHECK-DAG: %[[Zero:[^ ]*]] = "emitc.constant"{{.*}}value = 0
213
+ // CHECK: %[[ShiftRes:[^ ]*]] = emitc.expression : !emitc.size_t
214
+ // CHECK: %[[SHL:[^ ]*]] = emitc.bitwise_left_shift %[[C1]], %[[AmountIdx]] : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
215
+ // CHECK: %[[Ternary:[^ ]*]] = emitc.conditional %[[CmpNoExcess]], %[[SHL]], %[[Zero]] : !emitc.size_t
216
+ // CHECK: emitc.yield %[[Ternary]] : !emitc.size_t
217
+ %1 = arith.shli %cst0 , %cast1 : index
218
+ return
219
+ }
220
+
221
+ // -----
222
+
223
+ // CHECK-LABEL: arith_shift_right_index
224
+ // CHECK-SAME: %[[AMOUNT:.*]]: i32
225
+ func.func @arith_shift_right_index (%amount: i32 ) {
226
+ // CHECK-DAG: %[[C1:[^ ]*]] = "emitc.constant"(){{.*}}value = 42{{.*}}!emitc.size_t
227
+ // CHECK-DAG: %[[Cast1:[^ ]*]] = emitc.cast %[[AMOUNT]] : i32 to !emitc.ssize_t
228
+ // CHECK-DAG: %[[AmountIdx:[^ ]*]] = emitc.cast %[[Cast1]] : !emitc.ssize_t to !emitc.size_t
229
+ %arg0 = " arith.constant" () {value = 42 : index } : () -> (index )
230
+ %arg1 = arith.index_cast %amount : i32 to index
231
+
232
+ // CHECK-DAG: %[[Byte:[^ ]*]] = "emitc.constant"{{.*}}value = 8{{.*}}index
233
+ // CHECK-DAG: %[[SizeOf:[^ ]*]] = emitc.call_opaque "sizeof"(%[[Byte]]) : (!emitc.size_t) -> !emitc.size_t
234
+ // CHECK-DAG: %[[SizeConstant:[^ ]*]] = emitc.mul %[[Byte]], %[[SizeOf]] : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
235
+ // CHECK-DAG: %[[CmpNoExcess:[^ ]*]] = emitc.cmp lt, %[[AmountIdx]], %[[SizeConstant]] : (!emitc.size_t, !emitc.size_t) -> i1
236
+ // CHECK-DAG: %[[Zero:[^ ]*]] = "emitc.constant"{{.*}}value = 0{{.*}}!emitc.size_t
237
+ // CHECK: %[[ShiftRes:[^ ]*]] = emitc.expression : !emitc.size_t
238
+ // CHECK: %[[SHR:[^ ]*]] = emitc.bitwise_right_shift %[[C1]], %[[AmountIdx]] : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
239
+ // CHECK: %[[Ternary:[^ ]*]] = emitc.conditional %[[CmpNoExcess]], %[[SHR]], %[[Zero]] : !emitc.size_t
240
+ // CHECK: emitc.yield %[[Ternary]] : !emitc.size_t
241
+ %2 = arith.shrui %arg0 , %arg1 : index
242
+
243
+ // CHECK-DAG: %[[SC1:[^ ]*]] = emitc.cast %[[C1]] : !emitc.size_t to !emitc.ssize_t
244
+ // CHECK-DAG: %[[SByte:[^ ]*]] = "emitc.constant"{{.*}}value = 8{{.*}}index{{.*}}!emitc.size_t
245
+ // CHECK-DAG: %[[SSizeOf:[^ ]*]] = emitc.call_opaque "sizeof"(%[[SByte]]) : (!emitc.size_t) -> !emitc.size_t
246
+ // CHECK-DAG: %[[SSizeConstant:[^ ]*]] = emitc.mul %[[SByte]], %[[SSizeOf]] : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
247
+ // CHECK-DAG: %[[SCmpNoExcess:[^ ]*]] = emitc.cmp lt, %[[AmountIdx]], %[[SSizeConstant]] : (!emitc.size_t, !emitc.size_t) -> i1
248
+ // CHECK-DAG: %[[SZero:[^ ]*]] = "emitc.constant"{{.*}}value = 0{{.*}}!emitc.ssize_t
249
+ // CHECK: %[[SShiftRes:[^ ]*]] = emitc.expression : !emitc.ssize_t
250
+ // CHECK: %[[SHRSI:[^ ]*]] = emitc.bitwise_right_shift %[[SC1]], %[[AmountIdx]] : (!emitc.ssize_t, !emitc.size_t) -> !emitc.ssize_t
251
+ // CHECK: %[[STernary:[^ ]*]] = emitc.conditional %[[SCmpNoExcess]], %[[SHRSI]], %[[SZero]] : !emitc.ssize_t
252
+ // CHECK: emitc.yield %[[STernary]] : !emitc.ssize_t
253
+ // CHECK: emitc.cast %[[SShiftRes]] : !emitc.ssize_t to !emitc.size_t
254
+ %3 = arith.shrsi %arg0 , %arg1 : index
255
+
256
+ return
257
+ }
258
+
259
+ // -----
260
+
113
261
func.func @arith_select (%arg0: i1 , %arg1: tensor <8 xi32 >, %arg2: tensor <8 xi32 >) -> () {
114
262
// CHECK: [[V0:[^ ]*]] = emitc.conditional %arg0, %arg1, %arg2 : tensor<8xi32>
115
263
%0 = arith.select %arg0 , %arg1 , %arg2 : i1 , tensor <8 xi32 >
0 commit comments