@@ -622,4 +622,190 @@ define void @or8_nouse_seq_cst(ptr %p) #0 {
622
622
ret void
623
623
}
624
624
625
+ define void @atomic_umin_uint_max (ptr %addr ) {
626
+ ; CHECK-LABEL: @atomic_umin_uint_max(
627
+ ; CHECK-NEXT: [[RES:%.*]] = atomicrmw or ptr [[ADDR:%.*]], i32 0 monotonic, align 4
628
+ ; CHECK-NEXT: ret i32 [[RES]]
629
+ ;
630
+ ; X64-LABEL: atomic_umin_uint_max:
631
+ ; X64: # %bb.0:
632
+ ; X64-NEXT: movl (%rdi), %eax
633
+ ; X64-NEXT: .p2align 4
634
+ ; X64-NEXT: .LBB15_1: # %atomicrmw.start
635
+ ; X64-NEXT: # =>This Inner Loop Header: Depth=1
636
+ ; X64-NEXT: lock cmpxchgl %eax, (%rdi)
637
+ ; X64-NEXT: jne .LBB15_1
638
+ ; X64-NEXT: # %bb.2: # %atomicrmw.end
639
+ ; X64-NEXT: retq
640
+ ;
641
+ ; X86-LABEL: atomic_umin_uint_max:
642
+ ; X86: # %bb.0:
643
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
644
+ ; X86-NEXT: movl (%ecx), %eax
645
+ ; X86-NEXT: .p2align 4
646
+ ; X86-NEXT: .LBB15_1: # %atomicrmw.start
647
+ ; X86-NEXT: # =>This Inner Loop Header: Depth=1
648
+ ; X86-NEXT: lock cmpxchgl %eax, (%ecx)
649
+ ; X86-NEXT: jne .LBB15_1
650
+ ; X86-NEXT: # %bb.2: # %atomicrmw.end
651
+ ; X86-NEXT: retl
652
+ atomicrmw umin ptr %addr , i32 -1 seq_cst
653
+ ret void
654
+ }
655
+
656
+ define void @atomic_umax_zero (ptr %addr ) {
657
+ ; CHECK-LABEL: @atomic_umax_zero(
658
+ ; CHECK-NEXT: [[RES:%.*]] = atomicrmw or ptr [[ADDR:%.*]], i32 0 monotonic, align 4
659
+ ; CHECK-NEXT: ret i32 [[RES]]
660
+ ;
661
+ ; X64-LABEL: atomic_umax_zero:
662
+ ; X64: # %bb.0:
663
+ ; X64-NEXT: movl (%rdi), %eax
664
+ ; X64-NEXT: .p2align 4
665
+ ; X64-NEXT: .LBB16_1: # %atomicrmw.start
666
+ ; X64-NEXT: # =>This Inner Loop Header: Depth=1
667
+ ; X64-NEXT: lock cmpxchgl %eax, (%rdi)
668
+ ; X64-NEXT: jne .LBB16_1
669
+ ; X64-NEXT: # %bb.2: # %atomicrmw.end
670
+ ; X64-NEXT: retq
671
+ ;
672
+ ; X86-LABEL: atomic_umax_zero:
673
+ ; X86: # %bb.0:
674
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
675
+ ; X86-NEXT: movl (%ecx), %eax
676
+ ; X86-NEXT: .p2align 4
677
+ ; X86-NEXT: .LBB16_1: # %atomicrmw.start
678
+ ; X86-NEXT: # =>This Inner Loop Header: Depth=1
679
+ ; X86-NEXT: lock cmpxchgl %eax, (%ecx)
680
+ ; X86-NEXT: jne .LBB16_1
681
+ ; X86-NEXT: # %bb.2: # %atomicrmw.end
682
+ ; X86-NEXT: retl
683
+ atomicrmw umax ptr %addr , i32 0 seq_cst
684
+ ret void
685
+ }
686
+
687
+ define void @atomic_min_smax_char (ptr %addr ) {
688
+ ; CHECK-LABEL: @atomic_min_smax_char(
689
+ ; CHECK-NEXT: [[RES:%.*]] = atomicrmw or ptr [[ADDR:%.*]], i8 0 monotonic, align 1
690
+ ; CHECK-NEXT: ret i8 [[RES]]
691
+ ;
692
+ ; X64-LABEL: atomic_min_smax_char:
693
+ ; X64: # %bb.0:
694
+ ; X64-NEXT: movzbl (%rdi), %eax
695
+ ; X64-NEXT: .p2align 4
696
+ ; X64-NEXT: .LBB17_1: # %atomicrmw.start
697
+ ; X64-NEXT: # =>This Inner Loop Header: Depth=1
698
+ ; X64-NEXT: lock cmpxchgb %al, (%rdi)
699
+ ; X64-NEXT: jne .LBB17_1
700
+ ; X64-NEXT: # %bb.2: # %atomicrmw.end
701
+ ; X64-NEXT: retq
702
+ ;
703
+ ; X86-LABEL: atomic_min_smax_char:
704
+ ; X86: # %bb.0:
705
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
706
+ ; X86-NEXT: movzbl (%ecx), %eax
707
+ ; X86-NEXT: .p2align 4
708
+ ; X86-NEXT: .LBB17_1: # %atomicrmw.start
709
+ ; X86-NEXT: # =>This Inner Loop Header: Depth=1
710
+ ; X86-NEXT: lock cmpxchgb %al, (%ecx)
711
+ ; X86-NEXT: jne .LBB17_1
712
+ ; X86-NEXT: # %bb.2: # %atomicrmw.end
713
+ ; X86-NEXT: retl
714
+ atomicrmw min ptr %addr , i8 127 seq_cst
715
+ ret void
716
+ }
717
+
718
+ define void @atomic_max_smin_char (ptr %addr ) {
719
+ ; CHECK-LABEL: @atomic_max_smin_char(
720
+ ; CHECK-NEXT: [[RES:%.*]] = atomicrmw or ptr [[ADDR:%.*]], i8 0 monotonic, align 1
721
+ ; CHECK-NEXT: ret i8 [[RES]]
722
+ ;
723
+ ; X64-LABEL: atomic_max_smin_char:
724
+ ; X64: # %bb.0:
725
+ ; X64-NEXT: movzbl (%rdi), %eax
726
+ ; X64-NEXT: .p2align 4
727
+ ; X64-NEXT: .LBB18_1: # %atomicrmw.start
728
+ ; X64-NEXT: # =>This Inner Loop Header: Depth=1
729
+ ; X64-NEXT: lock cmpxchgb %al, (%rdi)
730
+ ; X64-NEXT: jne .LBB18_1
731
+ ; X64-NEXT: # %bb.2: # %atomicrmw.end
732
+ ; X64-NEXT: retq
733
+ ;
734
+ ; X86-LABEL: atomic_max_smin_char:
735
+ ; X86: # %bb.0:
736
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
737
+ ; X86-NEXT: movzbl (%ecx), %eax
738
+ ; X86-NEXT: .p2align 4
739
+ ; X86-NEXT: .LBB18_1: # %atomicrmw.start
740
+ ; X86-NEXT: # =>This Inner Loop Header: Depth=1
741
+ ; X86-NEXT: lock cmpxchgb %al, (%ecx)
742
+ ; X86-NEXT: jne .LBB18_1
743
+ ; X86-NEXT: # %bb.2: # %atomicrmw.end
744
+ ; X86-NEXT: retl
745
+ atomicrmw max ptr %addr , i8 -128 seq_cst
746
+ ret void
747
+ }
748
+
749
+ define void @atomic_min_umax_char (ptr %addr ) {
750
+ ; CHECK-LABEL: @atomic_min_umax_char(
751
+ ; CHECK-NEXT: [[RES:%.*]] = atomicrmw or ptr [[ADDR:%.*]], i8 0 monotonic, align 1
752
+ ; CHECK-NEXT: ret i8 [[RES]]
753
+ ;
754
+ ; X64-LABEL: atomic_min_umax_char:
755
+ ; X64: # %bb.0:
756
+ ; X64-NEXT: movzbl (%rdi), %eax
757
+ ; X64-NEXT: .p2align 4
758
+ ; X64-NEXT: .LBB19_1: # %atomicrmw.start
759
+ ; X64-NEXT: # =>This Inner Loop Header: Depth=1
760
+ ; X64-NEXT: lock cmpxchgb %al, (%rdi)
761
+ ; X64-NEXT: jne .LBB19_1
762
+ ; X64-NEXT: # %bb.2: # %atomicrmw.end
763
+ ; X64-NEXT: retq
764
+ ;
765
+ ; X86-LABEL: atomic_min_umax_char:
766
+ ; X86: # %bb.0:
767
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
768
+ ; X86-NEXT: movzbl (%ecx), %eax
769
+ ; X86-NEXT: .p2align 4
770
+ ; X86-NEXT: .LBB19_1: # %atomicrmw.start
771
+ ; X86-NEXT: # =>This Inner Loop Header: Depth=1
772
+ ; X86-NEXT: lock cmpxchgb %al, (%ecx)
773
+ ; X86-NEXT: jne .LBB19_1
774
+ ; X86-NEXT: # %bb.2: # %atomicrmw.end
775
+ ; X86-NEXT: retl
776
+ atomicrmw umin ptr %addr , i8 255 seq_cst
777
+ ret void
778
+ }
779
+
780
+ define void @atomic_max_umin_char (ptr %addr ) {
781
+ ; CHECK-LABEL: @atomic_max_umin_char(
782
+ ; CHECK-NEXT: [[RES:%.*]] = atomicrmw or ptr [[ADDR:%.*]], i8 0 monotonic, align 1
783
+ ; CHECK-NEXT: ret i8 [[RES]]
784
+ ;
785
+ ; X64-LABEL: atomic_max_umin_char:
786
+ ; X64: # %bb.0:
787
+ ; X64-NEXT: movzbl (%rdi), %eax
788
+ ; X64-NEXT: .p2align 4
789
+ ; X64-NEXT: .LBB20_1: # %atomicrmw.start
790
+ ; X64-NEXT: # =>This Inner Loop Header: Depth=1
791
+ ; X64-NEXT: lock cmpxchgb %al, (%rdi)
792
+ ; X64-NEXT: jne .LBB20_1
793
+ ; X64-NEXT: # %bb.2: # %atomicrmw.end
794
+ ; X64-NEXT: retq
795
+ ;
796
+ ; X86-LABEL: atomic_max_umin_char:
797
+ ; X86: # %bb.0:
798
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
799
+ ; X86-NEXT: movzbl (%ecx), %eax
800
+ ; X86-NEXT: .p2align 4
801
+ ; X86-NEXT: .LBB20_1: # %atomicrmw.start
802
+ ; X86-NEXT: # =>This Inner Loop Header: Depth=1
803
+ ; X86-NEXT: lock cmpxchgb %al, (%ecx)
804
+ ; X86-NEXT: jne .LBB20_1
805
+ ; X86-NEXT: # %bb.2: # %atomicrmw.end
806
+ ; X86-NEXT: retl
807
+ atomicrmw umax ptr %addr , i8 0 seq_cst
808
+ ret void
809
+ }
810
+
625
811
attributes #0 = { nounwind }
0 commit comments