@@ -262,4 +262,98 @@ define <4 x i65> @sign_4xi65(<4 x i65> %a) {
262
262
ret <4 x i65 > %res
263
263
}
264
264
265
+ define i32 @or_neg (i32 %x , i32 %y ) {
266
+ ; CHECK-LABEL: or_neg:
267
+ ; CHECK: // %bb.0:
268
+ ; CHECK-NEXT: orr w8, w0, #0x1
269
+ ; CHECK-NEXT: neg w8, w8
270
+ ; CHECK-NEXT: cmp w8, w1
271
+ ; CHECK-NEXT: cset w0, gt
272
+ ; CHECK-NEXT: ret
273
+ %3 = or i32 %x , 1
274
+ %4 = sub i32 0 , %3
275
+ %5 = icmp sgt i32 %4 , %y
276
+ %6 = zext i1 %5 to i32
277
+ ret i32 %6
278
+ }
279
+
280
+ define i32 @or_neg_ult (i32 %x , i32 %y ) {
281
+ ; CHECK-LABEL: or_neg_ult:
282
+ ; CHECK: // %bb.0:
283
+ ; CHECK-NEXT: orr w8, w0, #0x1
284
+ ; CHECK-NEXT: neg w8, w8
285
+ ; CHECK-NEXT: cmp w8, w1
286
+ ; CHECK-NEXT: cset w0, hi
287
+ ; CHECK-NEXT: ret
288
+ %3 = or i32 %x , 1
289
+ %4 = sub i32 0 , %3
290
+ %5 = icmp ugt i32 %4 , %y
291
+ %6 = zext i1 %5 to i32
292
+ ret i32 %6
293
+ }
294
+
295
+ ; Negative test
296
+
297
+ define i32 @or_neg_no_smin (i32 %x , i32 %y ) {
298
+ ; CHECK-LABEL: or_neg_no_smin:
299
+ ; CHECK: // %bb.0:
300
+ ; CHECK-NEXT: neg w8, w0
301
+ ; CHECK-NEXT: cmp w8, w1
302
+ ; CHECK-NEXT: cset w0, gt
303
+ ; CHECK-NEXT: ret
304
+ %4 = sub i32 0 , %x
305
+ %5 = icmp sgt i32 %4 , %y
306
+ %6 = zext i1 %5 to i32
307
+ ret i32 %6
308
+ }
309
+
310
+ ; Negative test
311
+
312
+ define i32 @or_neg_ult_no_zero (i32 %x , i32 %y ) {
313
+ ; CHECK-LABEL: or_neg_ult_no_zero:
314
+ ; CHECK: // %bb.0:
315
+ ; CHECK-NEXT: neg w8, w0
316
+ ; CHECK-NEXT: cmp w8, w1
317
+ ; CHECK-NEXT: cset w0, hi
318
+ ; CHECK-NEXT: ret
319
+ %4 = sub i32 0 , %x
320
+ %5 = icmp ugt i32 %4 , %y
321
+ %6 = zext i1 %5 to i32
322
+ ret i32 %6
323
+ }
324
+
325
+ define i32 @or_neg_no_smin_but_zero (i32 %x , i32 %y ) {
326
+ ; CHECK-LABEL: or_neg_no_smin_but_zero:
327
+ ; CHECK: // %bb.0:
328
+ ; CHECK-NEXT: bic w8, w0, w0, asr #31
329
+ ; CHECK-NEXT: neg w8, w8
330
+ ; CHECK-NEXT: cmp w8, w1
331
+ ; CHECK-NEXT: cset w0, gt
332
+ ; CHECK-NEXT: ret
333
+ %3 = call i32 @llvm.smax.i32 (i32 %x , i32 0 )
334
+ %4 = sub i32 0 , %3
335
+ %5 = icmp sgt i32 %4 , %y
336
+ %6 = zext i1 %5 to i32
337
+ ret i32 %6
338
+ }
339
+
340
+ define i32 @or_neg_slt_zero_but_no_smin (i32 %x , i32 %y ) {
341
+ ; CHECK-LABEL: or_neg_slt_zero_but_no_smin:
342
+ ; CHECK: // %bb.0:
343
+ ; CHECK-NEXT: mov w8, #9 // =0x9
344
+ ; CHECK-NEXT: cmp w0, #9
345
+ ; CHECK-NEXT: csel w8, w0, w8, lo
346
+ ; CHECK-NEXT: neg w8, w8
347
+ ; CHECK-NEXT: cmp w8, w1
348
+ ; CHECK-NEXT: cset w0, hi
349
+ ; CHECK-NEXT: ret
350
+ %3 = call i32 @llvm.umin.i32 (i32 %x , i32 9 )
351
+ %4 = sub i32 0 , %3
352
+ %5 = icmp ugt i32 %4 , %y
353
+ %6 = zext i1 %5 to i32
354
+ ret i32 %6
355
+ }
356
+
357
+ declare i32 @llvm.smax.i32 (i32 , i32 )
358
+ declare i32 @llvm.umax.i32 (i32 , i32 )
265
359
declare void @use_4xi1 (<4 x i1 >)
0 commit comments