@@ -258,3 +258,246 @@ define i32 @neg_range_int(i32 %a, i32 %b, i32 %c) {
258
258
ret i32 %retval.0
259
259
}
260
260
261
+ ; (b > -(d | 1) && a < c)
262
+ define i32 @neg_range_int_comp (i32 %a , i32 %b , i32 %c , i32 %d ) {
263
+ ; SDISEL-LABEL: neg_range_int_comp:
264
+ ; SDISEL: // %bb.0:
265
+ ; SDISEL-NEXT: orr w8, w3, #0x1
266
+ ; SDISEL-NEXT: cmp w0, w2
267
+ ; SDISEL-NEXT: ccmn w1, w8, #4, lt
268
+ ; SDISEL-NEXT: csel w0, w1, w0, gt
269
+ ; SDISEL-NEXT: ret
270
+ ;
271
+ ; GISEL-LABEL: neg_range_int_comp:
272
+ ; GISEL: // %bb.0:
273
+ ; GISEL-NEXT: orr w8, w3, #0x1
274
+ ; GISEL-NEXT: cmp w0, w2
275
+ ; GISEL-NEXT: neg w8, w8
276
+ ; GISEL-NEXT: ccmp w1, w8, #4, lt
277
+ ; GISEL-NEXT: csel w0, w1, w0, gt
278
+ ; GISEL-NEXT: ret
279
+ %dor = or i32 %d , 1
280
+ %negd = sub i32 0 , %dor
281
+ %cmp = icmp sgt i32 %b , %negd
282
+ %cmp1 = icmp slt i32 %a , %c
283
+ %or.cond = and i1 %cmp , %cmp1
284
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
285
+ ret i32 %retval.0
286
+ }
287
+
288
+ ; (b >u -(d | 1) && a < c)
289
+ define i32 @neg_range_int_comp_u (i32 %a , i32 %b , i32 %c , i32 %d ) {
290
+ ; SDISEL-LABEL: neg_range_int_comp_u:
291
+ ; SDISEL: // %bb.0:
292
+ ; SDISEL-NEXT: orr w8, w3, #0x1
293
+ ; SDISEL-NEXT: cmp w0, w2
294
+ ; SDISEL-NEXT: ccmn w1, w8, #0, lt
295
+ ; SDISEL-NEXT: csel w0, w1, w0, hi
296
+ ; SDISEL-NEXT: ret
297
+ ;
298
+ ; GISEL-LABEL: neg_range_int_comp_u:
299
+ ; GISEL: // %bb.0:
300
+ ; GISEL-NEXT: orr w8, w3, #0x1
301
+ ; GISEL-NEXT: cmp w0, w2
302
+ ; GISEL-NEXT: neg w8, w8
303
+ ; GISEL-NEXT: ccmp w1, w8, #0, lt
304
+ ; GISEL-NEXT: csel w0, w1, w0, hi
305
+ ; GISEL-NEXT: ret
306
+ %dor = or i32 %d , 1
307
+ %negd = sub i32 0 , %dor
308
+ %cmp = icmp ugt i32 %b , %negd
309
+ %cmp1 = icmp slt i32 %a , %c
310
+ %or.cond = and i1 %cmp , %cmp1
311
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
312
+ ret i32 %retval.0
313
+ }
314
+
315
+ ; (b > -(d | 1) && a u < c)
316
+ define i32 @neg_range_int_comp_ua (i32 %a , i32 %b , i32 %c , i32 %d ) {
317
+ ; SDISEL-LABEL: neg_range_int_comp_ua:
318
+ ; SDISEL: // %bb.0:
319
+ ; SDISEL-NEXT: orr w8, w3, #0x1
320
+ ; SDISEL-NEXT: cmp w0, w2
321
+ ; SDISEL-NEXT: ccmn w1, w8, #4, lo
322
+ ; SDISEL-NEXT: csel w0, w1, w0, gt
323
+ ; SDISEL-NEXT: ret
324
+ ;
325
+ ; GISEL-LABEL: neg_range_int_comp_ua:
326
+ ; GISEL: // %bb.0:
327
+ ; GISEL-NEXT: orr w8, w3, #0x1
328
+ ; GISEL-NEXT: cmp w0, w2
329
+ ; GISEL-NEXT: neg w8, w8
330
+ ; GISEL-NEXT: ccmp w1, w8, #4, lo
331
+ ; GISEL-NEXT: csel w0, w1, w0, gt
332
+ ; GISEL-NEXT: ret
333
+ %dor = or i32 %d , 1
334
+ %negd = sub i32 0 , %dor
335
+ %cmp = icmp sgt i32 %b , %negd
336
+ %cmp1 = icmp ult i32 %a , %c
337
+ %or.cond = and i1 %cmp , %cmp1
338
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
339
+ ret i32 %retval.0
340
+ }
341
+
342
+ ; (b <= -3 && a > c)
343
+ define i32 @neg_range_int_2 (i32 %a , i32 %b , i32 %c ) {
344
+ ; SDISEL-LABEL: neg_range_int_2:
345
+ ; SDISEL: // %bb.0:
346
+ ; SDISEL-NEXT: cmp w0, w2
347
+ ; SDISEL-NEXT: ccmn w1, #4, #4, gt
348
+ ; SDISEL-NEXT: csel w0, w1, w0, gt
349
+ ; SDISEL-NEXT: ret
350
+ ;
351
+ ; GISEL-LABEL: neg_range_int_2:
352
+ ; GISEL: // %bb.0:
353
+ ; GISEL-NEXT: cmp w0, w2
354
+ ; GISEL-NEXT: ccmn w1, #3, #8, gt
355
+ ; GISEL-NEXT: csel w0, w1, w0, ge
356
+ ; GISEL-NEXT: ret
357
+ %cmp = icmp sge i32 %b , -3
358
+ %cmp1 = icmp sgt i32 %a , %c
359
+ %or.cond = and i1 %cmp , %cmp1
360
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
361
+ ret i32 %retval.0
362
+ }
363
+
364
+ ; (b < -(d | 1) && a >= c)
365
+ define i32 @neg_range_int_comp2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
366
+ ; SDISEL-LABEL: neg_range_int_comp2:
367
+ ; SDISEL: // %bb.0:
368
+ ; SDISEL-NEXT: orr w8, w3, #0x1
369
+ ; SDISEL-NEXT: cmp w0, w2
370
+ ; SDISEL-NEXT: ccmn w1, w8, #0, ge
371
+ ; SDISEL-NEXT: csel w0, w1, w0, lt
372
+ ; SDISEL-NEXT: ret
373
+ ;
374
+ ; GISEL-LABEL: neg_range_int_comp2:
375
+ ; GISEL: // %bb.0:
376
+ ; GISEL-NEXT: orr w8, w3, #0x1
377
+ ; GISEL-NEXT: cmp w0, w2
378
+ ; GISEL-NEXT: neg w8, w8
379
+ ; GISEL-NEXT: ccmp w1, w8, #0, ge
380
+ ; GISEL-NEXT: csel w0, w1, w0, lt
381
+ ; GISEL-NEXT: ret
382
+ %dor = or i32 %d , 1
383
+ %negd = sub i32 0 , %dor
384
+ %cmp = icmp slt i32 %b , %negd
385
+ %cmp1 = icmp sge i32 %a , %c
386
+ %or.cond = and i1 %cmp , %cmp1
387
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
388
+ ret i32 %retval.0
389
+ }
390
+
391
+ ; (b <u -(d | 1) && a > c)
392
+ define i32 @neg_range_int_comp_u2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
393
+ ; SDISEL-LABEL: neg_range_int_comp_u2:
394
+ ; SDISEL: // %bb.0:
395
+ ; SDISEL-NEXT: orr w8, w3, #0x1
396
+ ; SDISEL-NEXT: cmp w0, w2
397
+ ; SDISEL-NEXT: ccmn w1, w8, #2, gt
398
+ ; SDISEL-NEXT: csel w0, w1, w0, lo
399
+ ; SDISEL-NEXT: ret
400
+ ;
401
+ ; GISEL-LABEL: neg_range_int_comp_u2:
402
+ ; GISEL: // %bb.0:
403
+ ; GISEL-NEXT: orr w8, w3, #0x1
404
+ ; GISEL-NEXT: cmp w0, w2
405
+ ; GISEL-NEXT: neg w8, w8
406
+ ; GISEL-NEXT: ccmp w1, w8, #2, gt
407
+ ; GISEL-NEXT: csel w0, w1, w0, lo
408
+ ; GISEL-NEXT: ret
409
+ %dor = or i32 %d , 1
410
+ %negd = sub i32 0 , %dor
411
+ %cmp = icmp ult i32 %b , %negd
412
+ %cmp1 = icmp sgt i32 %a , %c
413
+ %or.cond = and i1 %cmp , %cmp1
414
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
415
+ ret i32 %retval.0
416
+ }
417
+
418
+ ; (b > -(d | 1) && a u > c)
419
+ define i32 @neg_range_int_comp_ua2 (i32 %a , i32 %b , i32 %c , i32 %d ) {
420
+ ; SDISEL-LABEL: neg_range_int_comp_ua2:
421
+ ; SDISEL: // %bb.0:
422
+ ; SDISEL-NEXT: orr w8, w3, #0x1
423
+ ; SDISEL-NEXT: cmp w0, w2
424
+ ; SDISEL-NEXT: ccmn w1, w8, #4, hi
425
+ ; SDISEL-NEXT: csel w0, w1, w0, gt
426
+ ; SDISEL-NEXT: ret
427
+ ;
428
+ ; GISEL-LABEL: neg_range_int_comp_ua2:
429
+ ; GISEL: // %bb.0:
430
+ ; GISEL-NEXT: orr w8, w3, #0x1
431
+ ; GISEL-NEXT: cmp w0, w2
432
+ ; GISEL-NEXT: neg w8, w8
433
+ ; GISEL-NEXT: ccmp w1, w8, #4, hi
434
+ ; GISEL-NEXT: csel w0, w1, w0, gt
435
+ ; GISEL-NEXT: ret
436
+ %dor = or i32 %d , 1
437
+ %negd = sub i32 0 , %dor
438
+ %cmp = icmp sgt i32 %b , %negd
439
+ %cmp1 = icmp ugt i32 %a , %c
440
+ %or.cond = and i1 %cmp , %cmp1
441
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
442
+ ret i32 %retval.0
443
+ }
444
+
445
+ ; (b > -(d | 1) && a u == c)
446
+ define i32 @neg_range_int_comp_ua3 (i32 %a , i32 %b , i32 %c , i32 %d ) {
447
+ ; SDISEL-LABEL: neg_range_int_comp_ua3:
448
+ ; SDISEL: // %bb.0:
449
+ ; SDISEL-NEXT: orr w8, w3, #0x1
450
+ ; SDISEL-NEXT: cmp w0, w2
451
+ ; SDISEL-NEXT: ccmn w1, w8, #4, eq
452
+ ; SDISEL-NEXT: csel w0, w1, w0, gt
453
+ ; SDISEL-NEXT: ret
454
+ ;
455
+ ; GISEL-LABEL: neg_range_int_comp_ua3:
456
+ ; GISEL: // %bb.0:
457
+ ; GISEL-NEXT: orr w8, w3, #0x1
458
+ ; GISEL-NEXT: cmp w0, w2
459
+ ; GISEL-NEXT: neg w8, w8
460
+ ; GISEL-NEXT: ccmp w1, w8, #4, eq
461
+ ; GISEL-NEXT: csel w0, w1, w0, gt
462
+ ; GISEL-NEXT: ret
463
+ %dor = or i32 %d , 1
464
+ %negd = sub i32 0 , %dor
465
+ %cmp = icmp sgt i32 %b , %negd
466
+ %cmp1 = icmp eq i32 %a , %c
467
+ %or.cond = and i1 %cmp , %cmp1
468
+ %retval.0 = select i1 %or.cond , i32 %b , i32 %a
469
+ ret i32 %retval.0
470
+ }
471
+
472
+ ; -(a | 1) > (b | 3) && a < c
473
+ define i32 @neg_range_int_c (i32 %a , i32 %b , i32 %c ) {
474
+ ; SDISEL-LABEL: neg_range_int_c:
475
+ ; SDISEL: // %bb.0: // %entry
476
+ ; SDISEL-NEXT: orr w8, w0, #0x1
477
+ ; SDISEL-NEXT: orr w9, w1, #0x3
478
+ ; SDISEL-NEXT: cmn w9, w8
479
+ ; SDISEL-NEXT: ccmp w2, w0, #2, lo
480
+ ; SDISEL-NEXT: cset w0, lo
481
+ ; SDISEL-NEXT: ret
482
+ ;
483
+ ; GISEL-LABEL: neg_range_int_c:
484
+ ; GISEL: // %bb.0: // %entry
485
+ ; GISEL-NEXT: orr w8, w0, #0x1
486
+ ; GISEL-NEXT: orr w9, w1, #0x3
487
+ ; GISEL-NEXT: neg w8, w8
488
+ ; GISEL-NEXT: cmp w9, w8
489
+ ; GISEL-NEXT: cset w8, lo
490
+ ; GISEL-NEXT: cmp w2, w0
491
+ ; GISEL-NEXT: cset w9, lo
492
+ ; GISEL-NEXT: and w0, w8, w9
493
+ ; GISEL-NEXT: ret
494
+ entry:
495
+ %or = or i32 %a , 1
496
+ %sub = sub i32 0 , %or
497
+ %or1 = or i32 %b , 3
498
+ %cmp = icmp ult i32 %or1 , %sub
499
+ %cmp2 = icmp ult i32 %c , %a
500
+ %0 = and i1 %cmp , %cmp2
501
+ %land.ext = zext i1 %0 to i32
502
+ ret i32 %land.ext
503
+ }
0 commit comments