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