@@ -430,3 +430,187 @@ entry:
430
430
%cmp = icmp ne i32 %conv , %add
431
431
ret i1 %cmp
432
432
}
433
+
434
+ define i1 @cmn_large_imm (i32 %a ) {
435
+ ; CHECK-LABEL: cmn_large_imm:
436
+ ; CHECK: // %bb.0:
437
+ ; CHECK-NEXT: mov w8, #64765 // =0xfcfd
438
+ ; CHECK-NEXT: movk w8, #64764, lsl #16
439
+ ; CHECK-NEXT: cmp w0, w8
440
+ ; CHECK-NEXT: cset w0, gt
441
+ ; CHECK-NEXT: ret
442
+ %cmp = icmp sgt i32 %a , -50529027
443
+ ret i1 %cmp
444
+ }
445
+
446
+ define i1 @almost_immediate_neg_slt (i32 %x ) {
447
+ ; CHECK-LABEL: almost_immediate_neg_slt:
448
+ ; CHECK: // %bb.0:
449
+ ; CHECK-NEXT: mov w8, #4097 // =0x1001
450
+ ; CHECK-NEXT: movk w8, #65281, lsl #16
451
+ ; CHECK-NEXT: cmp w0, w8
452
+ ; CHECK-NEXT: cset w0, lt
453
+ ; CHECK-NEXT: ret
454
+ %cmp = icmp slt i32 %x , -16707583
455
+ ret i1 %cmp
456
+ }
457
+
458
+ define i1 @almost_immediate_neg_slt_64 (i64 %x ) {
459
+ ; CHECK-LABEL: almost_immediate_neg_slt_64:
460
+ ; CHECK: // %bb.0:
461
+ ; CHECK-NEXT: mov x8, #-61439 // =0xffffffffffff1001
462
+ ; CHECK-NEXT: movk x8, #65281, lsl #16
463
+ ; CHECK-NEXT: cmp x0, x8
464
+ ; CHECK-NEXT: cset w0, lt
465
+ ; CHECK-NEXT: ret
466
+ %cmp = icmp slt i64 %x , -16707583
467
+ ret i1 %cmp
468
+ }
469
+
470
+ define i1 @almost_immediate_neg_sge (i32 %x ) {
471
+ ; CHECK-LABEL: almost_immediate_neg_sge:
472
+ ; CHECK: // %bb.0:
473
+ ; CHECK-NEXT: cmn w0, #4079, lsl #12 // =16707584
474
+ ; CHECK-NEXT: cset w0, gt
475
+ ; CHECK-NEXT: ret
476
+ %cmp = icmp sge i32 %x , -16707583
477
+ ret i1 %cmp
478
+ }
479
+
480
+ define i1 @almost_immediate_neg_sge_64 (i64 %x ) {
481
+ ; CHECK-LABEL: almost_immediate_neg_sge_64:
482
+ ; CHECK: // %bb.0:
483
+ ; CHECK-NEXT: cmn x0, #4079, lsl #12 // =16707584
484
+ ; CHECK-NEXT: cset w0, gt
485
+ ; CHECK-NEXT: ret
486
+ %cmp = icmp sge i64 %x , -16707583
487
+ ret i1 %cmp
488
+ }
489
+
490
+ define i1 @almost_immediate_neg_uge (i32 %x ) {
491
+ ; CHECK-LABEL: almost_immediate_neg_uge:
492
+ ; CHECK: // %bb.0:
493
+ ; CHECK-NEXT: cmn w0, #4079, lsl #12 // =16707584
494
+ ; CHECK-NEXT: cset w0, hi
495
+ ; CHECK-NEXT: ret
496
+ %cmp = icmp uge i32 %x , -16707583
497
+ ret i1 %cmp
498
+ }
499
+
500
+ define i1 @almost_immediate_neg_uge_64 (i64 %x ) {
501
+ ; CHECK-LABEL: almost_immediate_neg_uge_64:
502
+ ; CHECK: // %bb.0:
503
+ ; CHECK-NEXT: cmn x0, #4079, lsl #12 // =16707584
504
+ ; CHECK-NEXT: cset w0, hi
505
+ ; CHECK-NEXT: ret
506
+ %cmp = icmp uge i64 %x , -16707583
507
+ ret i1 %cmp
508
+ }
509
+
510
+ define i1 @almost_immediate_neg_ult (i32 %x ) {
511
+ ; CHECK-LABEL: almost_immediate_neg_ult:
512
+ ; CHECK: // %bb.0:
513
+ ; CHECK-NEXT: mov w8, #4097 // =0x1001
514
+ ; CHECK-NEXT: movk w8, #65281, lsl #16
515
+ ; CHECK-NEXT: cmp w0, w8
516
+ ; CHECK-NEXT: cset w0, lo
517
+ ; CHECK-NEXT: ret
518
+ %cmp = icmp ult i32 %x , -16707583
519
+ ret i1 %cmp
520
+ }
521
+
522
+ define i1 @almost_immediate_neg_ult_64 (i64 %x ) {
523
+ ; CHECK-LABEL: almost_immediate_neg_ult_64:
524
+ ; CHECK: // %bb.0:
525
+ ; CHECK-NEXT: mov x8, #-61439 // =0xffffffffffff1001
526
+ ; CHECK-NEXT: movk x8, #65281, lsl #16
527
+ ; CHECK-NEXT: cmp x0, x8
528
+ ; CHECK-NEXT: cset w0, lo
529
+ ; CHECK-NEXT: ret
530
+ %cmp = icmp ult i64 %x , -16707583
531
+ ret i1 %cmp
532
+ }
533
+
534
+ define i1 @almost_immediate_neg_sle (i32 %x ) {
535
+ ; CHECK-LABEL: almost_immediate_neg_sle:
536
+ ; CHECK: // %bb.0:
537
+ ; CHECK-NEXT: cmn w0, #4095, lsl #12 // =16773120
538
+ ; CHECK-NEXT: cset w0, lt
539
+ ; CHECK-NEXT: ret
540
+ %cmp = icmp sle i32 %x , -16773121
541
+ ret i1 %cmp
542
+ }
543
+
544
+ define i1 @almost_immediate_neg_sle_64 (i64 %x ) {
545
+ ; CHECK-LABEL: almost_immediate_neg_sle_64:
546
+ ; CHECK: // %bb.0:
547
+ ; CHECK-NEXT: cmn x0, #4095, lsl #12 // =16773120
548
+ ; CHECK-NEXT: cset w0, lt
549
+ ; CHECK-NEXT: ret
550
+ %cmp = icmp sle i64 %x , -16773121
551
+ ret i1 %cmp
552
+ }
553
+
554
+ define i1 @almost_immediate_neg_sgt (i32 %x ) {
555
+ ; CHECK-LABEL: almost_immediate_neg_sgt:
556
+ ; CHECK: // %bb.0:
557
+ ; CHECK-NEXT: mov w8, #-16773121 // =0xff000fff
558
+ ; CHECK-NEXT: cmp w0, w8
559
+ ; CHECK-NEXT: cset w0, gt
560
+ ; CHECK-NEXT: ret
561
+ %cmp = icmp sgt i32 %x , -16773121
562
+ ret i1 %cmp
563
+ }
564
+
565
+ define i1 @almost_immediate_neg_sgt_64 (i64 %x ) {
566
+ ; CHECK-LABEL: almost_immediate_neg_sgt_64:
567
+ ; CHECK: // %bb.0:
568
+ ; CHECK-NEXT: mov x8, #-16773121 // =0xffffffffff000fff
569
+ ; CHECK-NEXT: cmp x0, x8
570
+ ; CHECK-NEXT: cset w0, gt
571
+ ; CHECK-NEXT: ret
572
+ %cmp = icmp sgt i64 %x , -16773121
573
+ ret i1 %cmp
574
+ }
575
+
576
+ define i1 @almost_immediate_neg_ule (i32 %x ) {
577
+ ; CHECK-LABEL: almost_immediate_neg_ule:
578
+ ; CHECK: // %bb.0:
579
+ ; CHECK-NEXT: cmn w0, #4095, lsl #12 // =16773120
580
+ ; CHECK-NEXT: cset w0, lo
581
+ ; CHECK-NEXT: ret
582
+ %cmp = icmp ule i32 %x , -16773121
583
+ ret i1 %cmp
584
+ }
585
+
586
+ define i1 @almost_immediate_neg_ule_64 (i64 %x ) {
587
+ ; CHECK-LABEL: almost_immediate_neg_ule_64:
588
+ ; CHECK: // %bb.0:
589
+ ; CHECK-NEXT: cmn x0, #4095, lsl #12 // =16773120
590
+ ; CHECK-NEXT: cset w0, lo
591
+ ; CHECK-NEXT: ret
592
+ %cmp = icmp ule i64 %x , -16773121
593
+ ret i1 %cmp
594
+ }
595
+
596
+ define i1 @almost_immediate_neg_ugt (i32 %x ) {
597
+ ; CHECK-LABEL: almost_immediate_neg_ugt:
598
+ ; CHECK: // %bb.0:
599
+ ; CHECK-NEXT: mov w8, #-16773121 // =0xff000fff
600
+ ; CHECK-NEXT: cmp w0, w8
601
+ ; CHECK-NEXT: cset w0, hi
602
+ ; CHECK-NEXT: ret
603
+ %cmp = icmp ugt i32 %x , -16773121
604
+ ret i1 %cmp
605
+ }
606
+
607
+ define i1 @almost_immediate_neg_ugt_64 (i64 %x ) {
608
+ ; CHECK-LABEL: almost_immediate_neg_ugt_64:
609
+ ; CHECK: // %bb.0:
610
+ ; CHECK-NEXT: mov x8, #-16773121 // =0xffffffffff000fff
611
+ ; CHECK-NEXT: cmp x0, x8
612
+ ; CHECK-NEXT: cset w0, hi
613
+ ; CHECK-NEXT: ret
614
+ %cmp = icmp ugt i64 %x , -16773121
615
+ ret i1 %cmp
616
+ }
0 commit comments