@@ -430,3 +430,187 @@ entry:
430430 %cmp = icmp ne i32 %conv , %add
431431 ret i1 %cmp
432432}
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