@@ -622,4 +622,336 @@ define void @or8_nouse_seq_cst(ptr %p) #0 {
622622 ret void
623623}
624624
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+
625957attributes #0 = { nounwind }
0 commit comments