@@ -622,4 +622,336 @@ 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
+
811
+ define void @atomic_fadd_zero (ptr %addr ) {
812
+ ; CHECK-LABEL: @atomic_fadd_zero(
813
+ ; CHECK-NEXT: [[RES:%.*]] = atomicrmw fadd ptr [[ADDR:%.*]], float -0.000000e+00 monotonic, align 4
814
+ ; CHECK-NEXT: ret float [[RES]]
815
+ ;
816
+ ; X64-LABEL: atomic_fadd_zero:
817
+ ; X64: # %bb.0:
818
+ ; X64-NEXT: movl (%rdi), %eax
819
+ ; X64-NEXT: .p2align 4
820
+ ; X64-NEXT: .LBB21_1: # %atomicrmw.start
821
+ ; X64-NEXT: # =>This Inner Loop Header: Depth=1
822
+ ; X64-NEXT: lock cmpxchgl %eax, (%rdi)
823
+ ; X64-NEXT: jne .LBB21_1
824
+ ; X64-NEXT: # %bb.2: # %atomicrmw.end
825
+ ; X64-NEXT: retq
826
+ ;
827
+ ; X86-SSE2-LABEL: atomic_fadd_zero:
828
+ ; X86-SSE2: # %bb.0:
829
+ ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
830
+ ; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
831
+ ; X86-SSE2-NEXT: .p2align 4
832
+ ; X86-SSE2-NEXT: .LBB21_1: # %atomicrmw.start
833
+ ; X86-SSE2-NEXT: # =>This Inner Loop Header: Depth=1
834
+ ; X86-SSE2-NEXT: movd %xmm0, %eax
835
+ ; X86-SSE2-NEXT: lock cmpxchgl %eax, (%ecx)
836
+ ; X86-SSE2-NEXT: movd %eax, %xmm0
837
+ ; X86-SSE2-NEXT: jne .LBB21_1
838
+ ; X86-SSE2-NEXT: # %bb.2: # %atomicrmw.end
839
+ ; X86-SSE2-NEXT: retl
840
+ ;
841
+ ; X86-SLM-LABEL: atomic_fadd_zero:
842
+ ; X86-SLM: # %bb.0:
843
+ ; X86-SLM-NEXT: subl $8, %esp
844
+ ; X86-SLM-NEXT: .cfi_def_cfa_offset 12
845
+ ; X86-SLM-NEXT: movl {{[0-9]+}}(%esp), %ecx
846
+ ; X86-SLM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
847
+ ; X86-SLM-NEXT: .p2align 4
848
+ ; X86-SLM-NEXT: .LBB21_1: # %atomicrmw.start
849
+ ; X86-SLM-NEXT: # =>This Inner Loop Header: Depth=1
850
+ ; X86-SLM-NEXT: movss %xmm0, (%esp)
851
+ ; X86-SLM-NEXT: movl (%esp), %eax
852
+ ; X86-SLM-NEXT: lock cmpxchgl %eax, (%ecx)
853
+ ; X86-SLM-NEXT: movl %eax, {{[0-9]+}}(%esp)
854
+ ; X86-SLM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
855
+ ; X86-SLM-NEXT: jne .LBB21_1
856
+ ; X86-SLM-NEXT: # %bb.2: # %atomicrmw.end
857
+ ; X86-SLM-NEXT: addl $8, %esp
858
+ ; X86-SLM-NEXT: .cfi_def_cfa_offset 4
859
+ ; X86-SLM-NEXT: retl
860
+ ;
861
+ ; X86-ATOM-LABEL: atomic_fadd_zero:
862
+ ; X86-ATOM: # %bb.0:
863
+ ; X86-ATOM-NEXT: leal -{{[0-9]+}}(%esp), %esp
864
+ ; X86-ATOM-NEXT: .cfi_def_cfa_offset 12
865
+ ; X86-ATOM-NEXT: movl {{[0-9]+}}(%esp), %ecx
866
+ ; X86-ATOM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
867
+ ; X86-ATOM-NEXT: .p2align 4
868
+ ; X86-ATOM-NEXT: .LBB21_1: # %atomicrmw.start
869
+ ; X86-ATOM-NEXT: # =>This Inner Loop Header: Depth=1
870
+ ; X86-ATOM-NEXT: movss %xmm0, (%esp)
871
+ ; X86-ATOM-NEXT: movl (%esp), %eax
872
+ ; X86-ATOM-NEXT: lock cmpxchgl %eax, (%ecx)
873
+ ; X86-ATOM-NEXT: movl %eax, {{[0-9]+}}(%esp)
874
+ ; X86-ATOM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
875
+ ; X86-ATOM-NEXT: jne .LBB21_1
876
+ ; X86-ATOM-NEXT: # %bb.2: # %atomicrmw.end
877
+ ; X86-ATOM-NEXT: leal {{[0-9]+}}(%esp), %esp
878
+ ; X86-ATOM-NEXT: .cfi_def_cfa_offset 4
879
+ ; X86-ATOM-NEXT: retl
880
+ atomicrmw fadd ptr %addr , float -0 .0 monotonic
881
+ ret void
882
+ }
883
+
884
+ define void @atomic_fsub_zero (ptr %addr ) {
885
+ ; CHECK-LABEL: @atomic_fsub_canon(
886
+ ; CHECK-NEXT: [[RES:%.*]] = atomicrmw fadd ptr [[ADDR:%.*]], float -0.000000e+00 release, align 4
887
+ ; CHECK-NEXT: ret float [[RES]]
888
+ ;
889
+ ; X64-LABEL: atomic_fsub_zero:
890
+ ; X64: # %bb.0:
891
+ ; X64-NEXT: movl (%rdi), %eax
892
+ ; X64-NEXT: .p2align 4
893
+ ; X64-NEXT: .LBB22_1: # %atomicrmw.start
894
+ ; X64-NEXT: # =>This Inner Loop Header: Depth=1
895
+ ; X64-NEXT: lock cmpxchgl %eax, (%rdi)
896
+ ; X64-NEXT: jne .LBB22_1
897
+ ; X64-NEXT: # %bb.2: # %atomicrmw.end
898
+ ; X64-NEXT: retq
899
+ ;
900
+ ; X86-SSE2-LABEL: atomic_fsub_zero:
901
+ ; X86-SSE2: # %bb.0:
902
+ ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
903
+ ; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
904
+ ; X86-SSE2-NEXT: .p2align 4
905
+ ; X86-SSE2-NEXT: .LBB22_1: # %atomicrmw.start
906
+ ; X86-SSE2-NEXT: # =>This Inner Loop Header: Depth=1
907
+ ; X86-SSE2-NEXT: movd %xmm0, %eax
908
+ ; X86-SSE2-NEXT: lock cmpxchgl %eax, (%ecx)
909
+ ; X86-SSE2-NEXT: movd %eax, %xmm0
910
+ ; X86-SSE2-NEXT: jne .LBB22_1
911
+ ; X86-SSE2-NEXT: # %bb.2: # %atomicrmw.end
912
+ ; X86-SSE2-NEXT: retl
913
+ ;
914
+ ; X86-SLM-LABEL: atomic_fsub_zero:
915
+ ; X86-SLM: # %bb.0:
916
+ ; X86-SLM-NEXT: subl $8, %esp
917
+ ; X86-SLM-NEXT: .cfi_def_cfa_offset 12
918
+ ; X86-SLM-NEXT: movl {{[0-9]+}}(%esp), %ecx
919
+ ; X86-SLM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
920
+ ; X86-SLM-NEXT: .p2align 4
921
+ ; X86-SLM-NEXT: .LBB22_1: # %atomicrmw.start
922
+ ; X86-SLM-NEXT: # =>This Inner Loop Header: Depth=1
923
+ ; X86-SLM-NEXT: movss %xmm0, (%esp)
924
+ ; X86-SLM-NEXT: movl (%esp), %eax
925
+ ; X86-SLM-NEXT: lock cmpxchgl %eax, (%ecx)
926
+ ; X86-SLM-NEXT: movl %eax, {{[0-9]+}}(%esp)
927
+ ; X86-SLM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
928
+ ; X86-SLM-NEXT: jne .LBB22_1
929
+ ; X86-SLM-NEXT: # %bb.2: # %atomicrmw.end
930
+ ; X86-SLM-NEXT: addl $8, %esp
931
+ ; X86-SLM-NEXT: .cfi_def_cfa_offset 4
932
+ ; X86-SLM-NEXT: retl
933
+ ;
934
+ ; X86-ATOM-LABEL: atomic_fsub_zero:
935
+ ; X86-ATOM: # %bb.0:
936
+ ; X86-ATOM-NEXT: leal -{{[0-9]+}}(%esp), %esp
937
+ ; X86-ATOM-NEXT: .cfi_def_cfa_offset 12
938
+ ; X86-ATOM-NEXT: movl {{[0-9]+}}(%esp), %ecx
939
+ ; X86-ATOM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
940
+ ; X86-ATOM-NEXT: .p2align 4
941
+ ; X86-ATOM-NEXT: .LBB22_1: # %atomicrmw.start
942
+ ; X86-ATOM-NEXT: # =>This Inner Loop Header: Depth=1
943
+ ; X86-ATOM-NEXT: movss %xmm0, (%esp)
944
+ ; X86-ATOM-NEXT: movl (%esp), %eax
945
+ ; X86-ATOM-NEXT: lock cmpxchgl %eax, (%ecx)
946
+ ; X86-ATOM-NEXT: movl %eax, {{[0-9]+}}(%esp)
947
+ ; X86-ATOM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
948
+ ; X86-ATOM-NEXT: jne .LBB22_1
949
+ ; X86-ATOM-NEXT: # %bb.2: # %atomicrmw.end
950
+ ; X86-ATOM-NEXT: leal {{[0-9]+}}(%esp), %esp
951
+ ; X86-ATOM-NEXT: .cfi_def_cfa_offset 4
952
+ ; X86-ATOM-NEXT: retl
953
+ atomicrmw fsub ptr %addr , float 0 .0 release
954
+ ret void
955
+ }
956
+
625
957
attributes #0 = { nounwind }
0 commit comments