@@ -588,3 +588,144 @@ entry:
588588 %old = atomicrmw xchg ptr %ptr , i32 %val monotonic
589589 ret i32 %old
590590}
591+
592+ define i8 @atomicrmw_sub_i8_arid (ptr align 2 %self ) {
593+ ; NO-ATOMIC-LABEL: atomicrmw_sub_i8_arid:
594+ ; NO-ATOMIC: .cfi_startproc
595+ ; NO-ATOMIC-NEXT: ; %bb.0: ; %start
596+ ; NO-ATOMIC-NEXT: suba.l #12, %sp
597+ ; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16
598+ ; NO-ATOMIC-NEXT: move.l (16,%sp), %a0
599+ ; NO-ATOMIC-NEXT: move.l (%a0), %d0
600+ ; NO-ATOMIC-NEXT: add.l #4, %d0
601+ ; NO-ATOMIC-NEXT: move.l %d0, (%sp)
602+ ; NO-ATOMIC-NEXT: move.l #1, (4,%sp)
603+ ; NO-ATOMIC-NEXT: jsr __sync_fetch_and_sub_1
604+ ; NO-ATOMIC-NEXT: adda.l #12, %sp
605+ ; NO-ATOMIC-NEXT: rts
606+ ;
607+ ; ATOMIC-LABEL: atomicrmw_sub_i8_arid:
608+ ; ATOMIC: .cfi_startproc
609+ ; ATOMIC-NEXT: ; %bb.0: ; %start
610+ ; ATOMIC-NEXT: suba.l #4, %sp
611+ ; ATOMIC-NEXT: .cfi_def_cfa_offset -8
612+ ; ATOMIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill
613+ ; ATOMIC-NEXT: move.l (8,%sp), %a0
614+ ; ATOMIC-NEXT: move.l (%a0), %a0
615+ ; ATOMIC-NEXT: move.b (4,%a0), %d1
616+ ; ATOMIC-NEXT: move.b %d1, %d0
617+ ; ATOMIC-NEXT: .LBB12_1: ; %atomicrmw.start
618+ ; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1
619+ ; ATOMIC-NEXT: move.b %d1, %d2
620+ ; ATOMIC-NEXT: add.b #-1, %d2
621+ ; ATOMIC-NEXT: cas.b %d0, %d2, (4,%a0)
622+ ; ATOMIC-NEXT: move.b %d0, %d2
623+ ; ATOMIC-NEXT: sub.b %d1, %d2
624+ ; ATOMIC-NEXT: seq %d1
625+ ; ATOMIC-NEXT: sub.b #1, %d1
626+ ; ATOMIC-NEXT: move.b %d0, %d1
627+ ; ATOMIC-NEXT: bne .LBB12_1
628+ ; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end
629+ ; ATOMIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload
630+ ; ATOMIC-NEXT: adda.l #4, %sp
631+ ; ATOMIC-NEXT: rts
632+ start:
633+ %self1 = load ptr , ptr %self , align 2
634+ %_18.i.i = getelementptr inbounds i8 , ptr %self1 , i32 4
635+ %6 = atomicrmw sub ptr %_18.i.i , i8 1 release , align 4
636+ ret i8 %6
637+ }
638+
639+ define i16 @atomicrmw_sub_i16_arid (ptr align 2 %self ) {
640+ ; NO-ATOMIC-LABEL: atomicrmw_sub_i16_arid:
641+ ; NO-ATOMIC: .cfi_startproc
642+ ; NO-ATOMIC-NEXT: ; %bb.0: ; %start
643+ ; NO-ATOMIC-NEXT: suba.l #12, %sp
644+ ; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16
645+ ; NO-ATOMIC-NEXT: move.l (16,%sp), %a0
646+ ; NO-ATOMIC-NEXT: move.l (%a0), %d0
647+ ; NO-ATOMIC-NEXT: add.l #4, %d0
648+ ; NO-ATOMIC-NEXT: move.l %d0, (%sp)
649+ ; NO-ATOMIC-NEXT: move.l #1, (4,%sp)
650+ ; NO-ATOMIC-NEXT: jsr __sync_fetch_and_sub_2
651+ ; NO-ATOMIC-NEXT: adda.l #12, %sp
652+ ; NO-ATOMIC-NEXT: rts
653+ ;
654+ ; ATOMIC-LABEL: atomicrmw_sub_i16_arid:
655+ ; ATOMIC: .cfi_startproc
656+ ; ATOMIC-NEXT: ; %bb.0: ; %start
657+ ; ATOMIC-NEXT: suba.l #4, %sp
658+ ; ATOMIC-NEXT: .cfi_def_cfa_offset -8
659+ ; ATOMIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill
660+ ; ATOMIC-NEXT: move.l (8,%sp), %a0
661+ ; ATOMIC-NEXT: move.l (%a0), %a0
662+ ; ATOMIC-NEXT: move.w (4,%a0), %d1
663+ ; ATOMIC-NEXT: move.w %d1, %d0
664+ ; ATOMIC-NEXT: .LBB13_1: ; %atomicrmw.start
665+ ; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1
666+ ; ATOMIC-NEXT: move.w %d1, %d2
667+ ; ATOMIC-NEXT: add.w #-1, %d2
668+ ; ATOMIC-NEXT: cas.w %d0, %d2, (4,%a0)
669+ ; ATOMIC-NEXT: move.w %d0, %d2
670+ ; ATOMIC-NEXT: sub.w %d1, %d2
671+ ; ATOMIC-NEXT: seq %d1
672+ ; ATOMIC-NEXT: sub.b #1, %d1
673+ ; ATOMIC-NEXT: move.w %d0, %d1
674+ ; ATOMIC-NEXT: bne .LBB13_1
675+ ; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end
676+ ; ATOMIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload
677+ ; ATOMIC-NEXT: adda.l #4, %sp
678+ ; ATOMIC-NEXT: rts
679+ start:
680+ %self1 = load ptr , ptr %self , align 2
681+ %_18.i.i = getelementptr inbounds i8 , ptr %self1 , i32 4
682+ %6 = atomicrmw sub ptr %_18.i.i , i16 1 release , align 4
683+ ret i16 %6
684+ }
685+
686+ define i32 @atomicrmw_sub_i32_arid (ptr align 2 %self ) {
687+ ; NO-ATOMIC-LABEL: atomicrmw_sub_i32_arid:
688+ ; NO-ATOMIC: .cfi_startproc
689+ ; NO-ATOMIC-NEXT: ; %bb.0: ; %start
690+ ; NO-ATOMIC-NEXT: suba.l #12, %sp
691+ ; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16
692+ ; NO-ATOMIC-NEXT: move.l (16,%sp), %a0
693+ ; NO-ATOMIC-NEXT: move.l (%a0), %d0
694+ ; NO-ATOMIC-NEXT: add.l #4, %d0
695+ ; NO-ATOMIC-NEXT: move.l %d0, (%sp)
696+ ; NO-ATOMIC-NEXT: move.l #1, (4,%sp)
697+ ; NO-ATOMIC-NEXT: jsr __sync_fetch_and_sub_4
698+ ; NO-ATOMIC-NEXT: adda.l #12, %sp
699+ ; NO-ATOMIC-NEXT: rts
700+ ;
701+ ; ATOMIC-LABEL: atomicrmw_sub_i32_arid:
702+ ; ATOMIC: .cfi_startproc
703+ ; ATOMIC-NEXT: ; %bb.0: ; %start
704+ ; ATOMIC-NEXT: suba.l #4, %sp
705+ ; ATOMIC-NEXT: .cfi_def_cfa_offset -8
706+ ; ATOMIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill
707+ ; ATOMIC-NEXT: move.l (8,%sp), %a0
708+ ; ATOMIC-NEXT: move.l (%a0), %a0
709+ ; ATOMIC-NEXT: move.l (4,%a0), %d1
710+ ; ATOMIC-NEXT: move.l %d1, %d0
711+ ; ATOMIC-NEXT: .LBB14_1: ; %atomicrmw.start
712+ ; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1
713+ ; ATOMIC-NEXT: move.l %d1, %d2
714+ ; ATOMIC-NEXT: add.l #-1, %d2
715+ ; ATOMIC-NEXT: cas.l %d0, %d2, (4,%a0)
716+ ; ATOMIC-NEXT: move.l %d0, %d2
717+ ; ATOMIC-NEXT: sub.l %d1, %d2
718+ ; ATOMIC-NEXT: seq %d1
719+ ; ATOMIC-NEXT: sub.b #1, %d1
720+ ; ATOMIC-NEXT: move.l %d0, %d1
721+ ; ATOMIC-NEXT: bne .LBB14_1
722+ ; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end
723+ ; ATOMIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload
724+ ; ATOMIC-NEXT: adda.l #4, %sp
725+ ; ATOMIC-NEXT: rts
726+ start:
727+ %self1 = load ptr , ptr %self , align 2
728+ %_18.i.i = getelementptr inbounds i8 , ptr %self1 , i32 4
729+ %6 = atomicrmw sub ptr %_18.i.i , i32 1 release , align 4
730+ ret i32 %6
731+ }
0 commit comments