1417 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC3; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC4; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC5; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC6; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=ATOMIC7; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=ATOMIC8; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 -verify-machineinstrs --code-model=large | FileCheck %s --check-prefix=ATOMIC9; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC10; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC11; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 -verify-machineinstrs --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC12 13define i8 @atomicrmw_add_i8(i8 %val, ptr %ptr) {14; NO-ATOMIC-LABEL: atomicrmw_add_i8:15; NO-ATOMIC: .cfi_startproc16; NO-ATOMIC-NEXT: ; %bb.0:17; NO-ATOMIC-NEXT: suba.l #12, %sp18; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -1619; NO-ATOMIC-NEXT: move.b (19,%sp), %d020; NO-ATOMIC-NEXT: and.l #255, %d021; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)22; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)23; NO-ATOMIC-NEXT: jsr __sync_fetch_and_add_124; NO-ATOMIC-NEXT: adda.l #12, %sp25; NO-ATOMIC-NEXT: rts26;27; NO-ATOMIC-PIC-LABEL: atomicrmw_add_i8:28; NO-ATOMIC-PIC: .cfi_startproc29; NO-ATOMIC-PIC-NEXT: ; %bb.0:30; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp31; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -1632; NO-ATOMIC-PIC-NEXT: move.b (19,%sp), %d033; NO-ATOMIC-PIC-NEXT: and.l #255, %d034; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)35; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)36; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_add_1@PLT,%pc)37; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp38; NO-ATOMIC-PIC-NEXT: rts39;40; ATOMIC-LABEL: atomicrmw_add_i8:41; ATOMIC: .cfi_startproc42; ATOMIC-NEXT: ; %bb.0:43; ATOMIC-NEXT: suba.l #8, %sp44; ATOMIC-NEXT: .cfi_def_cfa_offset -1245; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill46; ATOMIC-NEXT: move.b (15,%sp), %d147; ATOMIC-NEXT: move.l (16,%sp), %a048; ATOMIC-NEXT: move.b (%a0), %d249; ATOMIC-NEXT: move.b %d2, %d050; ATOMIC-NEXT: .LBB0_1: ; %atomicrmw.start51; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=152; ATOMIC-NEXT: move.b %d2, %d353; ATOMIC-NEXT: add.b %d1, %d354; ATOMIC-NEXT: cas.b %d0, %d3, (%a0)55; ATOMIC-NEXT: move.b %d0, %d356; ATOMIC-NEXT: sub.b %d2, %d357; ATOMIC-NEXT: seq %d258; ATOMIC-NEXT: and.b #1, %d259; ATOMIC-NEXT: cmpi.b #0, %d260; ATOMIC-NEXT: move.b %d0, %d261; ATOMIC-NEXT: beq .LBB0_162; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end63; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload64; ATOMIC-NEXT: adda.l #8, %sp65; ATOMIC-NEXT: rts66;67; ATOMIC-PIC-LABEL: atomicrmw_add_i8:68; ATOMIC-PIC: .cfi_startproc69; ATOMIC-PIC-NEXT: ; %bb.0:70; ATOMIC-PIC-NEXT: suba.l #8, %sp71; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -1272; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill73; ATOMIC-PIC-NEXT: move.b (15,%sp), %d174; ATOMIC-PIC-NEXT: move.l (16,%sp), %a075; ATOMIC-PIC-NEXT: move.b (%a0), %d276; ATOMIC-PIC-NEXT: move.b %d2, %d077; ATOMIC-PIC-NEXT: .LBB0_1: ; %atomicrmw.start78; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=179; ATOMIC-PIC-NEXT: move.b %d2, %d380; ATOMIC-PIC-NEXT: add.b %d1, %d381; ATOMIC-PIC-NEXT: cas.b %d0, %d3, (%a0)82; ATOMIC-PIC-NEXT: move.b %d0, %d383; ATOMIC-PIC-NEXT: sub.b %d2, %d384; ATOMIC-PIC-NEXT: seq %d285; ATOMIC-PIC-NEXT: and.b #1, %d286; ATOMIC-PIC-NEXT: cmpi.b #0, %d287; ATOMIC-PIC-NEXT: move.b %d0, %d288; ATOMIC-PIC-NEXT: beq .LBB0_189; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end90; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload91; ATOMIC-PIC-NEXT: adda.l #8, %sp92; ATOMIC-PIC-NEXT: rts93 %old = atomicrmw add ptr %ptr, i8 %val monotonic94 ret i8 %old95}96 97define i16 @atomicrmw_sub_i16(i16 %val, ptr %ptr) {98; NO-ATOMIC-LABEL: atomicrmw_sub_i16:99; NO-ATOMIC: .cfi_startproc100; NO-ATOMIC-NEXT: ; %bb.0:101; NO-ATOMIC-NEXT: suba.l #12, %sp102; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16103; NO-ATOMIC-NEXT: move.w (18,%sp), %d0104; NO-ATOMIC-NEXT: and.l #65535, %d0105; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)106; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)107; NO-ATOMIC-NEXT: jsr __sync_fetch_and_sub_2108; NO-ATOMIC-NEXT: adda.l #12, %sp109; NO-ATOMIC-NEXT: rts110;111; NO-ATOMIC-PIC-LABEL: atomicrmw_sub_i16:112; NO-ATOMIC-PIC: .cfi_startproc113; NO-ATOMIC-PIC-NEXT: ; %bb.0:114; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp115; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -16116; NO-ATOMIC-PIC-NEXT: move.w (18,%sp), %d0117; NO-ATOMIC-PIC-NEXT: and.l #65535, %d0118; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)119; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)120; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_sub_2@PLT,%pc)121; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp122; NO-ATOMIC-PIC-NEXT: rts123;124; ATOMIC-LABEL: atomicrmw_sub_i16:125; ATOMIC: .cfi_startproc126; ATOMIC-NEXT: ; %bb.0:127; ATOMIC-NEXT: suba.l #8, %sp128; ATOMIC-NEXT: .cfi_def_cfa_offset -12129; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill130; ATOMIC-NEXT: move.w (14,%sp), %d1131; ATOMIC-NEXT: move.l (16,%sp), %a0132; ATOMIC-NEXT: move.w (%a0), %d2133; ATOMIC-NEXT: move.w %d2, %d0134; ATOMIC-NEXT: .LBB1_1: ; %atomicrmw.start135; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1136; ATOMIC-NEXT: move.w %d2, %d3137; ATOMIC-NEXT: sub.w %d1, %d3138; ATOMIC-NEXT: cas.w %d0, %d3, (%a0)139; ATOMIC-NEXT: move.w %d0, %d3140; ATOMIC-NEXT: sub.w %d2, %d3141; ATOMIC-NEXT: seq %d2142; ATOMIC-NEXT: and.b #1, %d2143; ATOMIC-NEXT: cmpi.b #0, %d2144; ATOMIC-NEXT: move.w %d0, %d2145; ATOMIC-NEXT: beq .LBB1_1146; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end147; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload148; ATOMIC-NEXT: adda.l #8, %sp149; ATOMIC-NEXT: rts150;151; ATOMIC-PIC-LABEL: atomicrmw_sub_i16:152; ATOMIC-PIC: .cfi_startproc153; ATOMIC-PIC-NEXT: ; %bb.0:154; ATOMIC-PIC-NEXT: suba.l #8, %sp155; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -12156; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill157; ATOMIC-PIC-NEXT: move.w (14,%sp), %d1158; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0159; ATOMIC-PIC-NEXT: move.w (%a0), %d2160; ATOMIC-PIC-NEXT: move.w %d2, %d0161; ATOMIC-PIC-NEXT: .LBB1_1: ; %atomicrmw.start162; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1163; ATOMIC-PIC-NEXT: move.w %d2, %d3164; ATOMIC-PIC-NEXT: sub.w %d1, %d3165; ATOMIC-PIC-NEXT: cas.w %d0, %d3, (%a0)166; ATOMIC-PIC-NEXT: move.w %d0, %d3167; ATOMIC-PIC-NEXT: sub.w %d2, %d3168; ATOMIC-PIC-NEXT: seq %d2169; ATOMIC-PIC-NEXT: and.b #1, %d2170; ATOMIC-PIC-NEXT: cmpi.b #0, %d2171; ATOMIC-PIC-NEXT: move.w %d0, %d2172; ATOMIC-PIC-NEXT: beq .LBB1_1173; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end174; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload175; ATOMIC-PIC-NEXT: adda.l #8, %sp176; ATOMIC-PIC-NEXT: rts177 %old = atomicrmw sub ptr %ptr, i16 %val acquire178 ret i16 %old179}180 181define i32 @atomicrmw_and_i32(i32 %val, ptr %ptr) {182; NO-ATOMIC-LABEL: atomicrmw_and_i32:183; NO-ATOMIC: .cfi_startproc184; NO-ATOMIC-NEXT: ; %bb.0:185; NO-ATOMIC-NEXT: suba.l #12, %sp186; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16187; NO-ATOMIC-NEXT: move.l (16,%sp), (4,%sp)188; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)189; NO-ATOMIC-NEXT: jsr __sync_fetch_and_and_4190; NO-ATOMIC-NEXT: adda.l #12, %sp191; NO-ATOMIC-NEXT: rts192;193; NO-ATOMIC-PIC-LABEL: atomicrmw_and_i32:194; NO-ATOMIC-PIC: .cfi_startproc195; NO-ATOMIC-PIC-NEXT: ; %bb.0:196; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp197; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -16198; NO-ATOMIC-PIC-NEXT: move.l (16,%sp), (4,%sp)199; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)200; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_and_4@PLT,%pc)201; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp202; NO-ATOMIC-PIC-NEXT: rts203;204; ATOMIC-LABEL: atomicrmw_and_i32:205; ATOMIC: .cfi_startproc206; ATOMIC-NEXT: ; %bb.0:207; ATOMIC-NEXT: suba.l #8, %sp208; ATOMIC-NEXT: .cfi_def_cfa_offset -12209; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill210; ATOMIC-NEXT: move.l (12,%sp), %d1211; ATOMIC-NEXT: move.l (16,%sp), %a0212; ATOMIC-NEXT: move.l (%a0), %d2213; ATOMIC-NEXT: move.l %d2, %d0214; ATOMIC-NEXT: .LBB2_1: ; %atomicrmw.start215; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1216; ATOMIC-NEXT: move.l %d2, %d3217; ATOMIC-NEXT: and.l %d1, %d3218; ATOMIC-NEXT: cas.l %d0, %d3, (%a0)219; ATOMIC-NEXT: move.l %d0, %d3220; ATOMIC-NEXT: sub.l %d2, %d3221; ATOMIC-NEXT: seq %d2222; ATOMIC-NEXT: and.b #1, %d2223; ATOMIC-NEXT: cmpi.b #0, %d2224; ATOMIC-NEXT: move.l %d0, %d2225; ATOMIC-NEXT: beq .LBB2_1226; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end227; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload228; ATOMIC-NEXT: adda.l #8, %sp229; ATOMIC-NEXT: rts230;231; ATOMIC-PIC-LABEL: atomicrmw_and_i32:232; ATOMIC-PIC: .cfi_startproc233; ATOMIC-PIC-NEXT: ; %bb.0:234; ATOMIC-PIC-NEXT: suba.l #8, %sp235; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -12236; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill237; ATOMIC-PIC-NEXT: move.l (12,%sp), %d1238; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0239; ATOMIC-PIC-NEXT: move.l (%a0), %d2240; ATOMIC-PIC-NEXT: move.l %d2, %d0241; ATOMIC-PIC-NEXT: .LBB2_1: ; %atomicrmw.start242; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1243; ATOMIC-PIC-NEXT: move.l %d2, %d3244; ATOMIC-PIC-NEXT: and.l %d1, %d3245; ATOMIC-PIC-NEXT: cas.l %d0, %d3, (%a0)246; ATOMIC-PIC-NEXT: move.l %d0, %d3247; ATOMIC-PIC-NEXT: sub.l %d2, %d3248; ATOMIC-PIC-NEXT: seq %d2249; ATOMIC-PIC-NEXT: and.b #1, %d2250; ATOMIC-PIC-NEXT: cmpi.b #0, %d2251; ATOMIC-PIC-NEXT: move.l %d0, %d2252; ATOMIC-PIC-NEXT: beq .LBB2_1253; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end254; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload255; ATOMIC-PIC-NEXT: adda.l #8, %sp256; ATOMIC-PIC-NEXT: rts257 %old = atomicrmw and ptr %ptr, i32 %val seq_cst258 ret i32 %old259}260 261define i64 @atomicrmw_xor_i64(i64 %val, ptr %ptr) {262; NO-ATOMIC-LABEL: atomicrmw_xor_i64:263; NO-ATOMIC: .cfi_startproc264; NO-ATOMIC-NEXT: ; %bb.0:265; NO-ATOMIC-NEXT: suba.l #20, %sp266; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -24267; NO-ATOMIC-NEXT: move.l #3, (12,%sp)268; NO-ATOMIC-NEXT: move.l (28,%sp), (8,%sp)269; NO-ATOMIC-NEXT: move.l (24,%sp), (4,%sp)270; NO-ATOMIC-NEXT: move.l (32,%sp), (%sp)271; NO-ATOMIC-NEXT: jsr __atomic_fetch_xor_8272; NO-ATOMIC-NEXT: adda.l #20, %sp273; NO-ATOMIC-NEXT: rts274;275; NO-ATOMIC-PIC-LABEL: atomicrmw_xor_i64:276; NO-ATOMIC-PIC: .cfi_startproc277; NO-ATOMIC-PIC-NEXT: ; %bb.0:278; NO-ATOMIC-PIC-NEXT: suba.l #20, %sp279; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -24280; NO-ATOMIC-PIC-NEXT: move.l #3, (12,%sp)281; NO-ATOMIC-PIC-NEXT: move.l (28,%sp), (8,%sp)282; NO-ATOMIC-PIC-NEXT: move.l (24,%sp), (4,%sp)283; NO-ATOMIC-PIC-NEXT: move.l (32,%sp), (%sp)284; NO-ATOMIC-PIC-NEXT: jsr (__atomic_fetch_xor_8@PLT,%pc)285; NO-ATOMIC-PIC-NEXT: adda.l #20, %sp286; NO-ATOMIC-PIC-NEXT: rts287;288; ATOMIC-LABEL: atomicrmw_xor_i64:289; ATOMIC: .cfi_startproc290; ATOMIC-NEXT: ; %bb.0:291; ATOMIC-NEXT: suba.l #20, %sp292; ATOMIC-NEXT: .cfi_def_cfa_offset -24293; ATOMIC-NEXT: move.l #3, (12,%sp)294; ATOMIC-NEXT: move.l (28,%sp), (8,%sp)295; ATOMIC-NEXT: move.l (24,%sp), (4,%sp)296; ATOMIC-NEXT: move.l (32,%sp), (%sp)297; ATOMIC-NEXT: jsr __atomic_fetch_xor_8298; ATOMIC-NEXT: adda.l #20, %sp299; ATOMIC-NEXT: rts300;301; ATOMIC-PIC-LABEL: atomicrmw_xor_i64:302; ATOMIC-PIC: .cfi_startproc303; ATOMIC-PIC-NEXT: ; %bb.0:304; ATOMIC-PIC-NEXT: suba.l #20, %sp305; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -24306; ATOMIC-PIC-NEXT: move.l #3, (12,%sp)307; ATOMIC-PIC-NEXT: move.l (28,%sp), (8,%sp)308; ATOMIC-PIC-NEXT: move.l (24,%sp), (4,%sp)309; ATOMIC-PIC-NEXT: move.l (32,%sp), (%sp)310; ATOMIC-PIC-NEXT: jsr (__atomic_fetch_xor_8@PLT,%pc)311; ATOMIC-PIC-NEXT: adda.l #20, %sp312; ATOMIC-PIC-NEXT: rts313 %old = atomicrmw xor ptr %ptr, i64 %val release314 ret i64 %old315}316 317define i8 @atomicrmw_or_i8(i8 %val, ptr %ptr) {318; NO-ATOMIC-LABEL: atomicrmw_or_i8:319; NO-ATOMIC: .cfi_startproc320; NO-ATOMIC-NEXT: ; %bb.0:321; NO-ATOMIC-NEXT: suba.l #12, %sp322; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16323; NO-ATOMIC-NEXT: move.b (19,%sp), %d0324; NO-ATOMIC-NEXT: and.l #255, %d0325; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)326; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)327; NO-ATOMIC-NEXT: jsr __sync_fetch_and_or_1328; NO-ATOMIC-NEXT: adda.l #12, %sp329; NO-ATOMIC-NEXT: rts330;331; NO-ATOMIC-PIC-LABEL: atomicrmw_or_i8:332; NO-ATOMIC-PIC: .cfi_startproc333; NO-ATOMIC-PIC-NEXT: ; %bb.0:334; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp335; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -16336; NO-ATOMIC-PIC-NEXT: move.b (19,%sp), %d0337; NO-ATOMIC-PIC-NEXT: and.l #255, %d0338; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)339; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)340; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_or_1@PLT,%pc)341; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp342; NO-ATOMIC-PIC-NEXT: rts343;344; ATOMIC-LABEL: atomicrmw_or_i8:345; ATOMIC: .cfi_startproc346; ATOMIC-NEXT: ; %bb.0:347; ATOMIC-NEXT: suba.l #8, %sp348; ATOMIC-NEXT: .cfi_def_cfa_offset -12349; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill350; ATOMIC-NEXT: move.b (15,%sp), %d1351; ATOMIC-NEXT: move.l (16,%sp), %a0352; ATOMIC-NEXT: move.b (%a0), %d2353; ATOMIC-NEXT: move.b %d2, %d0354; ATOMIC-NEXT: .LBB4_1: ; %atomicrmw.start355; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1356; ATOMIC-NEXT: move.b %d2, %d3357; ATOMIC-NEXT: or.b %d1, %d3358; ATOMIC-NEXT: cas.b %d0, %d3, (%a0)359; ATOMIC-NEXT: move.b %d0, %d3360; ATOMIC-NEXT: sub.b %d2, %d3361; ATOMIC-NEXT: seq %d2362; ATOMIC-NEXT: and.b #1, %d2363; ATOMIC-NEXT: cmpi.b #0, %d2364; ATOMIC-NEXT: move.b %d0, %d2365; ATOMIC-NEXT: beq .LBB4_1366; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end367; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload368; ATOMIC-NEXT: adda.l #8, %sp369; ATOMIC-NEXT: rts370;371; ATOMIC-PIC-LABEL: atomicrmw_or_i8:372; ATOMIC-PIC: .cfi_startproc373; ATOMIC-PIC-NEXT: ; %bb.0:374; ATOMIC-PIC-NEXT: suba.l #8, %sp375; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -12376; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill377; ATOMIC-PIC-NEXT: move.b (15,%sp), %d1378; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0379; ATOMIC-PIC-NEXT: move.b (%a0), %d2380; ATOMIC-PIC-NEXT: move.b %d2, %d0381; ATOMIC-PIC-NEXT: .LBB4_1: ; %atomicrmw.start382; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1383; ATOMIC-PIC-NEXT: move.b %d2, %d3384; ATOMIC-PIC-NEXT: or.b %d1, %d3385; ATOMIC-PIC-NEXT: cas.b %d0, %d3, (%a0)386; ATOMIC-PIC-NEXT: move.b %d0, %d3387; ATOMIC-PIC-NEXT: sub.b %d2, %d3388; ATOMIC-PIC-NEXT: seq %d2389; ATOMIC-PIC-NEXT: and.b #1, %d2390; ATOMIC-PIC-NEXT: cmpi.b #0, %d2391; ATOMIC-PIC-NEXT: move.b %d0, %d2392; ATOMIC-PIC-NEXT: beq .LBB4_1393; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end394; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload395; ATOMIC-PIC-NEXT: adda.l #8, %sp396; ATOMIC-PIC-NEXT: rts397 %old = atomicrmw or ptr %ptr, i8 %val monotonic398 ret i8 %old399}400 401define i16 @atmoicrmw_nand_i16(i16 %val, ptr %ptr) {402; NO-ATOMIC-LABEL: atmoicrmw_nand_i16:403; NO-ATOMIC: .cfi_startproc404; NO-ATOMIC-NEXT: ; %bb.0:405; NO-ATOMIC-NEXT: suba.l #12, %sp406; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16407; NO-ATOMIC-NEXT: movem.l %d2, (8,%sp) ; 8-byte Folded Spill408; NO-ATOMIC-NEXT: move.w (18,%sp), %d2409; NO-ATOMIC-NEXT: move.l %d2, %d0410; NO-ATOMIC-NEXT: and.l #65535, %d0411; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)412; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)413; NO-ATOMIC-NEXT: jsr __sync_fetch_and_nand_2414; NO-ATOMIC-NEXT: move.w %d2, %d0415; NO-ATOMIC-NEXT: movem.l (8,%sp), %d2 ; 8-byte Folded Reload416; NO-ATOMIC-NEXT: adda.l #12, %sp417; NO-ATOMIC-NEXT: rts418;419; NO-ATOMIC-PIC-LABEL: atmoicrmw_nand_i16:420; NO-ATOMIC-PIC: .cfi_startproc421; NO-ATOMIC-PIC-NEXT: ; %bb.0:422; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp423; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -16424; NO-ATOMIC-PIC-NEXT: movem.l %d2, (8,%sp) ; 8-byte Folded Spill425; NO-ATOMIC-PIC-NEXT: move.w (18,%sp), %d2426; NO-ATOMIC-PIC-NEXT: move.l %d2, %d0427; NO-ATOMIC-PIC-NEXT: and.l #65535, %d0428; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)429; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)430; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_nand_2@PLT,%pc)431; NO-ATOMIC-PIC-NEXT: move.w %d2, %d0432; NO-ATOMIC-PIC-NEXT: movem.l (8,%sp), %d2 ; 8-byte Folded Reload433; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp434; NO-ATOMIC-PIC-NEXT: rts435;436; ATOMIC-LABEL: atmoicrmw_nand_i16:437; ATOMIC: .cfi_startproc438; ATOMIC-NEXT: ; %bb.0:439; ATOMIC-NEXT: suba.l #8, %sp440; ATOMIC-NEXT: .cfi_def_cfa_offset -12441; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill442; ATOMIC-NEXT: move.w (14,%sp), %d0443; ATOMIC-NEXT: move.l (16,%sp), %a0444; ATOMIC-NEXT: move.w (%a0), %d2445; ATOMIC-NEXT: move.w %d2, %d1446; ATOMIC-NEXT: .LBB5_1: ; %atomicrmw.start447; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1448; ATOMIC-NEXT: move.w %d2, %d3449; ATOMIC-NEXT: and.w %d0, %d3450; ATOMIC-NEXT: not.w %d3451; ATOMIC-NEXT: cas.w %d1, %d3, (%a0)452; ATOMIC-NEXT: move.w %d1, %d3453; ATOMIC-NEXT: sub.w %d2, %d3454; ATOMIC-NEXT: seq %d2455; ATOMIC-NEXT: and.b #1, %d2456; ATOMIC-NEXT: cmpi.b #0, %d2457; ATOMIC-NEXT: move.w %d1, %d2458; ATOMIC-NEXT: beq .LBB5_1459; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end460; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload461; ATOMIC-NEXT: adda.l #8, %sp462; ATOMIC-NEXT: rts463;464; ATOMIC-PIC-LABEL: atmoicrmw_nand_i16:465; ATOMIC-PIC: .cfi_startproc466; ATOMIC-PIC-NEXT: ; %bb.0:467; ATOMIC-PIC-NEXT: suba.l #8, %sp468; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -12469; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill470; ATOMIC-PIC-NEXT: move.w (14,%sp), %d0471; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0472; ATOMIC-PIC-NEXT: move.w (%a0), %d2473; ATOMIC-PIC-NEXT: move.w %d2, %d1474; ATOMIC-PIC-NEXT: .LBB5_1: ; %atomicrmw.start475; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1476; ATOMIC-PIC-NEXT: move.w %d2, %d3477; ATOMIC-PIC-NEXT: and.w %d0, %d3478; ATOMIC-PIC-NEXT: not.w %d3479; ATOMIC-PIC-NEXT: cas.w %d1, %d3, (%a0)480; ATOMIC-PIC-NEXT: move.w %d1, %d3481; ATOMIC-PIC-NEXT: sub.w %d2, %d3482; ATOMIC-PIC-NEXT: seq %d2483; ATOMIC-PIC-NEXT: and.b #1, %d2484; ATOMIC-PIC-NEXT: cmpi.b #0, %d2485; ATOMIC-PIC-NEXT: move.w %d1, %d2486; ATOMIC-PIC-NEXT: beq .LBB5_1487; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end488; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload489; ATOMIC-PIC-NEXT: adda.l #8, %sp490; ATOMIC-PIC-NEXT: rts491 %old = atomicrmw nand ptr %ptr, i16 %val seq_cst492 ret i16 %val493}494 495define i32 @atomicrmw_min_i32(i32 %val, ptr %ptr) {496; NO-ATOMIC-LABEL: atomicrmw_min_i32:497; NO-ATOMIC: .cfi_startproc498; NO-ATOMIC-NEXT: ; %bb.0:499; NO-ATOMIC-NEXT: suba.l #12, %sp500; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16501; NO-ATOMIC-NEXT: move.l (16,%sp), (4,%sp)502; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)503; NO-ATOMIC-NEXT: jsr __sync_fetch_and_min_4504; NO-ATOMIC-NEXT: adda.l #12, %sp505; NO-ATOMIC-NEXT: rts506;507; NO-ATOMIC-PIC-LABEL: atomicrmw_min_i32:508; NO-ATOMIC-PIC: .cfi_startproc509; NO-ATOMIC-PIC-NEXT: ; %bb.0:510; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp511; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -16512; NO-ATOMIC-PIC-NEXT: move.l (16,%sp), (4,%sp)513; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)514; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_min_4@PLT,%pc)515; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp516; NO-ATOMIC-PIC-NEXT: rts517;518; ATOMIC-LABEL: atomicrmw_min_i32:519; ATOMIC: .cfi_startproc520; ATOMIC-NEXT: ; %bb.0:521; ATOMIC-NEXT: suba.l #8, %sp522; ATOMIC-NEXT: .cfi_def_cfa_offset -12523; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill524; ATOMIC-NEXT: move.l (12,%sp), %d1525; ATOMIC-NEXT: move.l (16,%sp), %a0526; ATOMIC-NEXT: move.l (%a0), %d2527; ATOMIC-NEXT: bra .LBB6_1528; ATOMIC-NEXT: .LBB6_3: ; %atomicrmw.start529; ATOMIC-NEXT: ; in Loop: Header=BB6_1 Depth=1530; ATOMIC-NEXT: move.l %d2, %d0531; ATOMIC-NEXT: cas.l %d0, %d3, (%a0)532; ATOMIC-NEXT: move.l %d0, %d3533; ATOMIC-NEXT: sub.l %d2, %d3534; ATOMIC-NEXT: seq %d2535; ATOMIC-NEXT: and.b #1, %d2536; ATOMIC-NEXT: cmpi.b #0, %d2537; ATOMIC-NEXT: move.l %d0, %d2538; ATOMIC-NEXT: bne .LBB6_4539; ATOMIC-NEXT: .LBB6_1: ; %atomicrmw.start540; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1541; ATOMIC-NEXT: move.l %d2, %d0542; ATOMIC-NEXT: sub.l %d1, %d0543; ATOMIC-NEXT: move.l %d2, %d3544; ATOMIC-NEXT: ble .LBB6_3545; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.start546; ATOMIC-NEXT: ; in Loop: Header=BB6_1 Depth=1547; ATOMIC-NEXT: move.l %d1, %d3548; ATOMIC-NEXT: bra .LBB6_3549; ATOMIC-NEXT: .LBB6_4: ; %atomicrmw.end550; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload551; ATOMIC-NEXT: adda.l #8, %sp552; ATOMIC-NEXT: rts553;554; ATOMIC-PIC-LABEL: atomicrmw_min_i32:555; ATOMIC-PIC: .cfi_startproc556; ATOMIC-PIC-NEXT: ; %bb.0:557; ATOMIC-PIC-NEXT: suba.l #8, %sp558; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -12559; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill560; ATOMIC-PIC-NEXT: move.l (12,%sp), %d1561; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0562; ATOMIC-PIC-NEXT: move.l (%a0), %d2563; ATOMIC-PIC-NEXT: bra .LBB6_1564; ATOMIC-PIC-NEXT: .LBB6_3: ; %atomicrmw.start565; ATOMIC-PIC-NEXT: ; in Loop: Header=BB6_1 Depth=1566; ATOMIC-PIC-NEXT: move.l %d2, %d0567; ATOMIC-PIC-NEXT: cas.l %d0, %d3, (%a0)568; ATOMIC-PIC-NEXT: move.l %d0, %d3569; ATOMIC-PIC-NEXT: sub.l %d2, %d3570; ATOMIC-PIC-NEXT: seq %d2571; ATOMIC-PIC-NEXT: and.b #1, %d2572; ATOMIC-PIC-NEXT: cmpi.b #0, %d2573; ATOMIC-PIC-NEXT: move.l %d0, %d2574; ATOMIC-PIC-NEXT: bne .LBB6_4575; ATOMIC-PIC-NEXT: .LBB6_1: ; %atomicrmw.start576; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1577; ATOMIC-PIC-NEXT: move.l %d2, %d0578; ATOMIC-PIC-NEXT: sub.l %d1, %d0579; ATOMIC-PIC-NEXT: move.l %d2, %d3580; ATOMIC-PIC-NEXT: ble .LBB6_3581; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.start582; ATOMIC-PIC-NEXT: ; in Loop: Header=BB6_1 Depth=1583; ATOMIC-PIC-NEXT: move.l %d1, %d3584; ATOMIC-PIC-NEXT: bra .LBB6_3585; ATOMIC-PIC-NEXT: .LBB6_4: ; %atomicrmw.end586; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload587; ATOMIC-PIC-NEXT: adda.l #8, %sp588; ATOMIC-PIC-NEXT: rts589 %old = atomicrmw min ptr %ptr, i32 %val acquire590 ret i32 %old591}592 593define i64 @atomicrmw_max_i64(i64 %val, ptr %ptr) {594; NO-ATOMIC-LABEL: atomicrmw_max_i64:595; NO-ATOMIC: .cfi_startproc596; NO-ATOMIC-NEXT: ; %bb.0:597; NO-ATOMIC-NEXT: suba.l #52, %sp598; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -56599; NO-ATOMIC-NEXT: movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill600; NO-ATOMIC-NEXT: move.l (60,%sp), %d3601; NO-ATOMIC-NEXT: move.l (56,%sp), %d4602; NO-ATOMIC-NEXT: move.l (64,%sp), %a2603; NO-ATOMIC-NEXT: move.l (4,%a2), %d1604; NO-ATOMIC-NEXT: move.l (%a2), %d0605; NO-ATOMIC-NEXT: lea (24,%sp), %a3606; NO-ATOMIC-NEXT: bra .LBB7_1607; NO-ATOMIC-NEXT: .LBB7_3: ; %atomicrmw.start608; NO-ATOMIC-NEXT: ; in Loop: Header=BB7_1 Depth=1609; NO-ATOMIC-NEXT: move.l %d1, (12,%sp)610; NO-ATOMIC-NEXT: move.l %d0, (8,%sp)611; NO-ATOMIC-NEXT: move.l #5, (20,%sp)612; NO-ATOMIC-NEXT: move.l #5, (16,%sp)613; NO-ATOMIC-NEXT: jsr __atomic_compare_exchange_8614; NO-ATOMIC-NEXT: move.b %d0, %d2615; NO-ATOMIC-NEXT: move.l (28,%sp), %d1616; NO-ATOMIC-NEXT: move.l (24,%sp), %d0617; NO-ATOMIC-NEXT: cmpi.b #0, %d2618; NO-ATOMIC-NEXT: bne .LBB7_4619; NO-ATOMIC-NEXT: .LBB7_1: ; %atomicrmw.start620; NO-ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1621; NO-ATOMIC-NEXT: move.l %d0, (24,%sp)622; NO-ATOMIC-NEXT: move.l %d1, (28,%sp)623; NO-ATOMIC-NEXT: move.l %a2, (%sp)624; NO-ATOMIC-NEXT: move.l %a3, (4,%sp)625; NO-ATOMIC-NEXT: move.l %d3, %d2626; NO-ATOMIC-NEXT: sub.l %d1, %d2627; NO-ATOMIC-NEXT: move.l %d4, %d2628; NO-ATOMIC-NEXT: subx.l %d0, %d2629; NO-ATOMIC-NEXT: slt %d2630; NO-ATOMIC-NEXT: cmpi.b #0, %d2631; NO-ATOMIC-NEXT: bne .LBB7_3632; NO-ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.start633; NO-ATOMIC-NEXT: ; in Loop: Header=BB7_1 Depth=1634; NO-ATOMIC-NEXT: move.l %d3, %d1635; NO-ATOMIC-NEXT: move.l %d4, %d0636; NO-ATOMIC-NEXT: bra .LBB7_3637; NO-ATOMIC-NEXT: .LBB7_4: ; %atomicrmw.end638; NO-ATOMIC-NEXT: movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload639; NO-ATOMIC-NEXT: adda.l #52, %sp640; NO-ATOMIC-NEXT: rts641;642; NO-ATOMIC-PIC-LABEL: atomicrmw_max_i64:643; NO-ATOMIC-PIC: .cfi_startproc644; NO-ATOMIC-PIC-NEXT: ; %bb.0:645; NO-ATOMIC-PIC-NEXT: suba.l #52, %sp646; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -56647; NO-ATOMIC-PIC-NEXT: movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill648; NO-ATOMIC-PIC-NEXT: move.l (60,%sp), %d3649; NO-ATOMIC-PIC-NEXT: move.l (56,%sp), %d4650; NO-ATOMIC-PIC-NEXT: move.l (64,%sp), %a2651; NO-ATOMIC-PIC-NEXT: move.l (4,%a2), %d1652; NO-ATOMIC-PIC-NEXT: move.l (%a2), %d0653; NO-ATOMIC-PIC-NEXT: lea (24,%sp), %a3654; NO-ATOMIC-PIC-NEXT: bra .LBB7_1655; NO-ATOMIC-PIC-NEXT: .LBB7_3: ; %atomicrmw.start656; NO-ATOMIC-PIC-NEXT: ; in Loop: Header=BB7_1 Depth=1657; NO-ATOMIC-PIC-NEXT: move.l %d1, (12,%sp)658; NO-ATOMIC-PIC-NEXT: move.l %d0, (8,%sp)659; NO-ATOMIC-PIC-NEXT: move.l #5, (20,%sp)660; NO-ATOMIC-PIC-NEXT: move.l #5, (16,%sp)661; NO-ATOMIC-PIC-NEXT: jsr (__atomic_compare_exchange_8@PLT,%pc)662; NO-ATOMIC-PIC-NEXT: move.b %d0, %d2663; NO-ATOMIC-PIC-NEXT: move.l (28,%sp), %d1664; NO-ATOMIC-PIC-NEXT: move.l (24,%sp), %d0665; NO-ATOMIC-PIC-NEXT: cmpi.b #0, %d2666; NO-ATOMIC-PIC-NEXT: bne .LBB7_4667; NO-ATOMIC-PIC-NEXT: .LBB7_1: ; %atomicrmw.start668; NO-ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1669; NO-ATOMIC-PIC-NEXT: move.l %d0, (24,%sp)670; NO-ATOMIC-PIC-NEXT: move.l %d1, (28,%sp)671; NO-ATOMIC-PIC-NEXT: move.l %a2, (%sp)672; NO-ATOMIC-PIC-NEXT: move.l %a3, (4,%sp)673; NO-ATOMIC-PIC-NEXT: move.l %d3, %d2674; NO-ATOMIC-PIC-NEXT: sub.l %d1, %d2675; NO-ATOMIC-PIC-NEXT: move.l %d4, %d2676; NO-ATOMIC-PIC-NEXT: subx.l %d0, %d2677; NO-ATOMIC-PIC-NEXT: slt %d2678; NO-ATOMIC-PIC-NEXT: cmpi.b #0, %d2679; NO-ATOMIC-PIC-NEXT: bne .LBB7_3680; NO-ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.start681; NO-ATOMIC-PIC-NEXT: ; in Loop: Header=BB7_1 Depth=1682; NO-ATOMIC-PIC-NEXT: move.l %d3, %d1683; NO-ATOMIC-PIC-NEXT: move.l %d4, %d0684; NO-ATOMIC-PIC-NEXT: bra .LBB7_3685; NO-ATOMIC-PIC-NEXT: .LBB7_4: ; %atomicrmw.end686; NO-ATOMIC-PIC-NEXT: movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload687; NO-ATOMIC-PIC-NEXT: adda.l #52, %sp688; NO-ATOMIC-PIC-NEXT: rts689;690; ATOMIC-LABEL: atomicrmw_max_i64:691; ATOMIC: .cfi_startproc692; ATOMIC-NEXT: ; %bb.0:693; ATOMIC-NEXT: suba.l #52, %sp694; ATOMIC-NEXT: .cfi_def_cfa_offset -56695; ATOMIC-NEXT: movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill696; ATOMIC-NEXT: move.l (60,%sp), %d3697; ATOMIC-NEXT: move.l (56,%sp), %d4698; ATOMIC-NEXT: move.l (64,%sp), %a2699; ATOMIC-NEXT: move.l (4,%a2), %d1700; ATOMIC-NEXT: move.l (%a2), %d0701; ATOMIC-NEXT: lea (24,%sp), %a3702; ATOMIC-NEXT: bra .LBB7_1703; ATOMIC-NEXT: .LBB7_3: ; %atomicrmw.start704; ATOMIC-NEXT: ; in Loop: Header=BB7_1 Depth=1705; ATOMIC-NEXT: move.l %d1, (12,%sp)706; ATOMIC-NEXT: move.l %d0, (8,%sp)707; ATOMIC-NEXT: move.l #5, (20,%sp)708; ATOMIC-NEXT: move.l #5, (16,%sp)709; ATOMIC-NEXT: jsr __atomic_compare_exchange_8710; ATOMIC-NEXT: move.b %d0, %d2711; ATOMIC-NEXT: move.l (28,%sp), %d1712; ATOMIC-NEXT: move.l (24,%sp), %d0713; ATOMIC-NEXT: cmpi.b #0, %d2714; ATOMIC-NEXT: bne .LBB7_4715; ATOMIC-NEXT: .LBB7_1: ; %atomicrmw.start716; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1717; ATOMIC-NEXT: move.l %d0, (24,%sp)718; ATOMIC-NEXT: move.l %d1, (28,%sp)719; ATOMIC-NEXT: move.l %a2, (%sp)720; ATOMIC-NEXT: move.l %a3, (4,%sp)721; ATOMIC-NEXT: move.l %d3, %d2722; ATOMIC-NEXT: sub.l %d1, %d2723; ATOMIC-NEXT: move.l %d4, %d2724; ATOMIC-NEXT: subx.l %d0, %d2725; ATOMIC-NEXT: slt %d2726; ATOMIC-NEXT: cmpi.b #0, %d2727; ATOMIC-NEXT: bne .LBB7_3728; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.start729; ATOMIC-NEXT: ; in Loop: Header=BB7_1 Depth=1730; ATOMIC-NEXT: move.l %d3, %d1731; ATOMIC-NEXT: move.l %d4, %d0732; ATOMIC-NEXT: bra .LBB7_3733; ATOMIC-NEXT: .LBB7_4: ; %atomicrmw.end734; ATOMIC-NEXT: movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload735; ATOMIC-NEXT: adda.l #52, %sp736; ATOMIC-NEXT: rts737;738; ATOMIC-PIC-LABEL: atomicrmw_max_i64:739; ATOMIC-PIC: .cfi_startproc740; ATOMIC-PIC-NEXT: ; %bb.0:741; ATOMIC-PIC-NEXT: suba.l #52, %sp742; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -56743; ATOMIC-PIC-NEXT: movem.l %d2-%d4/%a2-%a3, (32,%sp) ; 24-byte Folded Spill744; ATOMIC-PIC-NEXT: move.l (60,%sp), %d3745; ATOMIC-PIC-NEXT: move.l (56,%sp), %d4746; ATOMIC-PIC-NEXT: move.l (64,%sp), %a2747; ATOMIC-PIC-NEXT: move.l (4,%a2), %d1748; ATOMIC-PIC-NEXT: move.l (%a2), %d0749; ATOMIC-PIC-NEXT: lea (24,%sp), %a3750; ATOMIC-PIC-NEXT: bra .LBB7_1751; ATOMIC-PIC-NEXT: .LBB7_3: ; %atomicrmw.start752; ATOMIC-PIC-NEXT: ; in Loop: Header=BB7_1 Depth=1753; ATOMIC-PIC-NEXT: move.l %d1, (12,%sp)754; ATOMIC-PIC-NEXT: move.l %d0, (8,%sp)755; ATOMIC-PIC-NEXT: move.l #5, (20,%sp)756; ATOMIC-PIC-NEXT: move.l #5, (16,%sp)757; ATOMIC-PIC-NEXT: jsr (__atomic_compare_exchange_8@PLT,%pc)758; ATOMIC-PIC-NEXT: move.b %d0, %d2759; ATOMIC-PIC-NEXT: move.l (28,%sp), %d1760; ATOMIC-PIC-NEXT: move.l (24,%sp), %d0761; ATOMIC-PIC-NEXT: cmpi.b #0, %d2762; ATOMIC-PIC-NEXT: bne .LBB7_4763; ATOMIC-PIC-NEXT: .LBB7_1: ; %atomicrmw.start764; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1765; ATOMIC-PIC-NEXT: move.l %d0, (24,%sp)766; ATOMIC-PIC-NEXT: move.l %d1, (28,%sp)767; ATOMIC-PIC-NEXT: move.l %a2, (%sp)768; ATOMIC-PIC-NEXT: move.l %a3, (4,%sp)769; ATOMIC-PIC-NEXT: move.l %d3, %d2770; ATOMIC-PIC-NEXT: sub.l %d1, %d2771; ATOMIC-PIC-NEXT: move.l %d4, %d2772; ATOMIC-PIC-NEXT: subx.l %d0, %d2773; ATOMIC-PIC-NEXT: slt %d2774; ATOMIC-PIC-NEXT: cmpi.b #0, %d2775; ATOMIC-PIC-NEXT: bne .LBB7_3776; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.start777; ATOMIC-PIC-NEXT: ; in Loop: Header=BB7_1 Depth=1778; ATOMIC-PIC-NEXT: move.l %d3, %d1779; ATOMIC-PIC-NEXT: move.l %d4, %d0780; ATOMIC-PIC-NEXT: bra .LBB7_3781; ATOMIC-PIC-NEXT: .LBB7_4: ; %atomicrmw.end782; ATOMIC-PIC-NEXT: movem.l (32,%sp), %d2-%d4/%a2-%a3 ; 24-byte Folded Reload783; ATOMIC-PIC-NEXT: adda.l #52, %sp784; ATOMIC-PIC-NEXT: rts785 %old = atomicrmw max ptr %ptr, i64 %val seq_cst786 ret i64 %old787}788 789define i8 @atomicrmw_i8_umin(i8 %val, ptr %ptr) {790; NO-ATOMIC-LABEL: atomicrmw_i8_umin:791; NO-ATOMIC: .cfi_startproc792; NO-ATOMIC-NEXT: ; %bb.0:793; NO-ATOMIC-NEXT: suba.l #12, %sp794; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16795; NO-ATOMIC-NEXT: move.b (19,%sp), %d0796; NO-ATOMIC-NEXT: and.l #255, %d0797; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)798; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)799; NO-ATOMIC-NEXT: jsr __sync_fetch_and_umin_1800; NO-ATOMIC-NEXT: adda.l #12, %sp801; NO-ATOMIC-NEXT: rts802;803; NO-ATOMIC-PIC-LABEL: atomicrmw_i8_umin:804; NO-ATOMIC-PIC: .cfi_startproc805; NO-ATOMIC-PIC-NEXT: ; %bb.0:806; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp807; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -16808; NO-ATOMIC-PIC-NEXT: move.b (19,%sp), %d0809; NO-ATOMIC-PIC-NEXT: and.l #255, %d0810; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)811; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)812; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_umin_1@PLT,%pc)813; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp814; NO-ATOMIC-PIC-NEXT: rts815;816; ATOMIC-LABEL: atomicrmw_i8_umin:817; ATOMIC: .cfi_startproc818; ATOMIC-NEXT: ; %bb.0:819; ATOMIC-NEXT: suba.l #8, %sp820; ATOMIC-NEXT: .cfi_def_cfa_offset -12821; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill822; ATOMIC-NEXT: move.b (15,%sp), %d1823; ATOMIC-NEXT: move.l (16,%sp), %a0824; ATOMIC-NEXT: move.b (%a0), %d2825; ATOMIC-NEXT: bra .LBB8_1826; ATOMIC-NEXT: .LBB8_3: ; %atomicrmw.start827; ATOMIC-NEXT: ; in Loop: Header=BB8_1 Depth=1828; ATOMIC-NEXT: move.b %d2, %d0829; ATOMIC-NEXT: cas.b %d0, %d3, (%a0)830; ATOMIC-NEXT: move.b %d0, %d3831; ATOMIC-NEXT: sub.b %d2, %d3832; ATOMIC-NEXT: seq %d2833; ATOMIC-NEXT: and.b #1, %d2834; ATOMIC-NEXT: cmpi.b #0, %d2835; ATOMIC-NEXT: move.b %d0, %d2836; ATOMIC-NEXT: bne .LBB8_4837; ATOMIC-NEXT: .LBB8_1: ; %atomicrmw.start838; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1839; ATOMIC-NEXT: move.b %d2, %d0840; ATOMIC-NEXT: sub.b %d1, %d0841; ATOMIC-NEXT: move.b %d2, %d3842; ATOMIC-NEXT: bls .LBB8_3843; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.start844; ATOMIC-NEXT: ; in Loop: Header=BB8_1 Depth=1845; ATOMIC-NEXT: move.b %d1, %d3846; ATOMIC-NEXT: bra .LBB8_3847; ATOMIC-NEXT: .LBB8_4: ; %atomicrmw.end848; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload849; ATOMIC-NEXT: adda.l #8, %sp850; ATOMIC-NEXT: rts851;852; ATOMIC-PIC-LABEL: atomicrmw_i8_umin:853; ATOMIC-PIC: .cfi_startproc854; ATOMIC-PIC-NEXT: ; %bb.0:855; ATOMIC-PIC-NEXT: suba.l #8, %sp856; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -12857; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill858; ATOMIC-PIC-NEXT: move.b (15,%sp), %d1859; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0860; ATOMIC-PIC-NEXT: move.b (%a0), %d2861; ATOMIC-PIC-NEXT: bra .LBB8_1862; ATOMIC-PIC-NEXT: .LBB8_3: ; %atomicrmw.start863; ATOMIC-PIC-NEXT: ; in Loop: Header=BB8_1 Depth=1864; ATOMIC-PIC-NEXT: move.b %d2, %d0865; ATOMIC-PIC-NEXT: cas.b %d0, %d3, (%a0)866; ATOMIC-PIC-NEXT: move.b %d0, %d3867; ATOMIC-PIC-NEXT: sub.b %d2, %d3868; ATOMIC-PIC-NEXT: seq %d2869; ATOMIC-PIC-NEXT: and.b #1, %d2870; ATOMIC-PIC-NEXT: cmpi.b #0, %d2871; ATOMIC-PIC-NEXT: move.b %d0, %d2872; ATOMIC-PIC-NEXT: bne .LBB8_4873; ATOMIC-PIC-NEXT: .LBB8_1: ; %atomicrmw.start874; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1875; ATOMIC-PIC-NEXT: move.b %d2, %d0876; ATOMIC-PIC-NEXT: sub.b %d1, %d0877; ATOMIC-PIC-NEXT: move.b %d2, %d3878; ATOMIC-PIC-NEXT: bls .LBB8_3879; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.start880; ATOMIC-PIC-NEXT: ; in Loop: Header=BB8_1 Depth=1881; ATOMIC-PIC-NEXT: move.b %d1, %d3882; ATOMIC-PIC-NEXT: bra .LBB8_3883; ATOMIC-PIC-NEXT: .LBB8_4: ; %atomicrmw.end884; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload885; ATOMIC-PIC-NEXT: adda.l #8, %sp886; ATOMIC-PIC-NEXT: rts887 %old = atomicrmw umin ptr %ptr, i8 %val release888 ret i8 %old889}890 891define i16 @atomicrmw_umax_i16(i16 %val, ptr %ptr) {892; NO-ATOMIC-LABEL: atomicrmw_umax_i16:893; NO-ATOMIC: .cfi_startproc894; NO-ATOMIC-NEXT: ; %bb.0:895; NO-ATOMIC-NEXT: suba.l #12, %sp896; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16897; NO-ATOMIC-NEXT: move.w (18,%sp), %d0898; NO-ATOMIC-NEXT: and.l #65535, %d0899; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)900; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)901; NO-ATOMIC-NEXT: jsr __sync_fetch_and_umax_2902; NO-ATOMIC-NEXT: adda.l #12, %sp903; NO-ATOMIC-NEXT: rts904;905; NO-ATOMIC-PIC-LABEL: atomicrmw_umax_i16:906; NO-ATOMIC-PIC: .cfi_startproc907; NO-ATOMIC-PIC-NEXT: ; %bb.0:908; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp909; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -16910; NO-ATOMIC-PIC-NEXT: move.w (18,%sp), %d0911; NO-ATOMIC-PIC-NEXT: and.l #65535, %d0912; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)913; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)914; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_umax_2@PLT,%pc)915; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp916; NO-ATOMIC-PIC-NEXT: rts917;918; ATOMIC-LABEL: atomicrmw_umax_i16:919; ATOMIC: .cfi_startproc920; ATOMIC-NEXT: ; %bb.0:921; ATOMIC-NEXT: suba.l #8, %sp922; ATOMIC-NEXT: .cfi_def_cfa_offset -12923; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill924; ATOMIC-NEXT: move.w (14,%sp), %d1925; ATOMIC-NEXT: move.l (16,%sp), %a0926; ATOMIC-NEXT: move.w (%a0), %d2927; ATOMIC-NEXT: bra .LBB9_1928; ATOMIC-NEXT: .LBB9_3: ; %atomicrmw.start929; ATOMIC-NEXT: ; in Loop: Header=BB9_1 Depth=1930; ATOMIC-NEXT: move.w %d2, %d0931; ATOMIC-NEXT: cas.w %d0, %d3, (%a0)932; ATOMIC-NEXT: move.w %d0, %d3933; ATOMIC-NEXT: sub.w %d2, %d3934; ATOMIC-NEXT: seq %d2935; ATOMIC-NEXT: and.b #1, %d2936; ATOMIC-NEXT: cmpi.b #0, %d2937; ATOMIC-NEXT: move.w %d0, %d2938; ATOMIC-NEXT: bne .LBB9_4939; ATOMIC-NEXT: .LBB9_1: ; %atomicrmw.start940; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=1941; ATOMIC-NEXT: move.w %d2, %d0942; ATOMIC-NEXT: sub.w %d1, %d0943; ATOMIC-NEXT: move.w %d2, %d3944; ATOMIC-NEXT: bhi .LBB9_3945; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.start946; ATOMIC-NEXT: ; in Loop: Header=BB9_1 Depth=1947; ATOMIC-NEXT: move.w %d1, %d3948; ATOMIC-NEXT: bra .LBB9_3949; ATOMIC-NEXT: .LBB9_4: ; %atomicrmw.end950; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload951; ATOMIC-NEXT: adda.l #8, %sp952; ATOMIC-NEXT: rts953;954; ATOMIC-PIC-LABEL: atomicrmw_umax_i16:955; ATOMIC-PIC: .cfi_startproc956; ATOMIC-PIC-NEXT: ; %bb.0:957; ATOMIC-PIC-NEXT: suba.l #8, %sp958; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -12959; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill960; ATOMIC-PIC-NEXT: move.w (14,%sp), %d1961; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0962; ATOMIC-PIC-NEXT: move.w (%a0), %d2963; ATOMIC-PIC-NEXT: bra .LBB9_1964; ATOMIC-PIC-NEXT: .LBB9_3: ; %atomicrmw.start965; ATOMIC-PIC-NEXT: ; in Loop: Header=BB9_1 Depth=1966; ATOMIC-PIC-NEXT: move.w %d2, %d0967; ATOMIC-PIC-NEXT: cas.w %d0, %d3, (%a0)968; ATOMIC-PIC-NEXT: move.w %d0, %d3969; ATOMIC-PIC-NEXT: sub.w %d2, %d3970; ATOMIC-PIC-NEXT: seq %d2971; ATOMIC-PIC-NEXT: and.b #1, %d2972; ATOMIC-PIC-NEXT: cmpi.b #0, %d2973; ATOMIC-PIC-NEXT: move.w %d0, %d2974; ATOMIC-PIC-NEXT: bne .LBB9_4975; ATOMIC-PIC-NEXT: .LBB9_1: ; %atomicrmw.start976; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=1977; ATOMIC-PIC-NEXT: move.w %d2, %d0978; ATOMIC-PIC-NEXT: sub.w %d1, %d0979; ATOMIC-PIC-NEXT: move.w %d2, %d3980; ATOMIC-PIC-NEXT: bhi .LBB9_3981; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.start982; ATOMIC-PIC-NEXT: ; in Loop: Header=BB9_1 Depth=1983; ATOMIC-PIC-NEXT: move.w %d1, %d3984; ATOMIC-PIC-NEXT: bra .LBB9_3985; ATOMIC-PIC-NEXT: .LBB9_4: ; %atomicrmw.end986; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload987; ATOMIC-PIC-NEXT: adda.l #8, %sp988; ATOMIC-PIC-NEXT: rts989 %old = atomicrmw umax ptr %ptr, i16 %val seq_cst990 ret i16 %old991}992 993define i16 @atomicrmw_xchg_i16(i16 %val, ptr %ptr) {994; NO-ATOMIC-LABEL: atomicrmw_xchg_i16:995; NO-ATOMIC: .cfi_startproc996; NO-ATOMIC-NEXT: ; %bb.0: ; %entry997; NO-ATOMIC-NEXT: suba.l #12, %sp998; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16999; NO-ATOMIC-NEXT: move.w (18,%sp), %d01000; NO-ATOMIC-NEXT: and.l #65535, %d01001; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)1002; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)1003; NO-ATOMIC-NEXT: jsr __sync_lock_test_and_set_21004; NO-ATOMIC-NEXT: adda.l #12, %sp1005; NO-ATOMIC-NEXT: rts1006;1007; NO-ATOMIC-PIC-LABEL: atomicrmw_xchg_i16:1008; NO-ATOMIC-PIC: .cfi_startproc1009; NO-ATOMIC-PIC-NEXT: ; %bb.0: ; %entry1010; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp1011; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -161012; NO-ATOMIC-PIC-NEXT: move.w (18,%sp), %d01013; NO-ATOMIC-PIC-NEXT: and.l #65535, %d01014; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)1015; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)1016; NO-ATOMIC-PIC-NEXT: jsr (__sync_lock_test_and_set_2@PLT,%pc)1017; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp1018; NO-ATOMIC-PIC-NEXT: rts1019;1020; ATOMIC-LABEL: atomicrmw_xchg_i16:1021; ATOMIC: .cfi_startproc1022; ATOMIC-NEXT: ; %bb.0: ; %entry1023; ATOMIC-NEXT: suba.l #8, %sp1024; ATOMIC-NEXT: .cfi_def_cfa_offset -121025; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill1026; ATOMIC-NEXT: move.w (14,%sp), %d11027; ATOMIC-NEXT: move.l (16,%sp), %a01028; ATOMIC-NEXT: move.w (%a0), %d21029; ATOMIC-NEXT: move.w %d2, %d01030; ATOMIC-NEXT: .LBB10_1: ; %atomicrmw.start1031; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=11032; ATOMIC-NEXT: cas.w %d0, %d1, (%a0)1033; ATOMIC-NEXT: move.w %d0, %d31034; ATOMIC-NEXT: sub.w %d2, %d31035; ATOMIC-NEXT: seq %d21036; ATOMIC-NEXT: and.b #1, %d21037; ATOMIC-NEXT: cmpi.b #0, %d21038; ATOMIC-NEXT: move.w %d0, %d21039; ATOMIC-NEXT: beq .LBB10_11040; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end1041; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload1042; ATOMIC-NEXT: adda.l #8, %sp1043; ATOMIC-NEXT: rts1044;1045; ATOMIC-PIC-LABEL: atomicrmw_xchg_i16:1046; ATOMIC-PIC: .cfi_startproc1047; ATOMIC-PIC-NEXT: ; %bb.0: ; %entry1048; ATOMIC-PIC-NEXT: suba.l #8, %sp1049; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -121050; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill1051; ATOMIC-PIC-NEXT: move.w (14,%sp), %d11052; ATOMIC-PIC-NEXT: move.l (16,%sp), %a01053; ATOMIC-PIC-NEXT: move.w (%a0), %d21054; ATOMIC-PIC-NEXT: move.w %d2, %d01055; ATOMIC-PIC-NEXT: .LBB10_1: ; %atomicrmw.start1056; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=11057; ATOMIC-PIC-NEXT: cas.w %d0, %d1, (%a0)1058; ATOMIC-PIC-NEXT: move.w %d0, %d31059; ATOMIC-PIC-NEXT: sub.w %d2, %d31060; ATOMIC-PIC-NEXT: seq %d21061; ATOMIC-PIC-NEXT: and.b #1, %d21062; ATOMIC-PIC-NEXT: cmpi.b #0, %d21063; ATOMIC-PIC-NEXT: move.w %d0, %d21064; ATOMIC-PIC-NEXT: beq .LBB10_11065; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end1066; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload1067; ATOMIC-PIC-NEXT: adda.l #8, %sp1068; ATOMIC-PIC-NEXT: rts1069entry:1070 %old = atomicrmw xchg ptr %ptr, i16 %val monotonic1071 ret i16 %old1072}1073 1074define i32 @atomicrmw_xchg_i32(i32 %val, ptr %ptr) {1075; NO-ATOMIC-LABEL: atomicrmw_xchg_i32:1076; NO-ATOMIC: .cfi_startproc1077; NO-ATOMIC-NEXT: ; %bb.0: ; %entry1078; NO-ATOMIC-NEXT: suba.l #12, %sp1079; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -161080; NO-ATOMIC-NEXT: move.l (16,%sp), (4,%sp)1081; NO-ATOMIC-NEXT: move.l (20,%sp), (%sp)1082; NO-ATOMIC-NEXT: jsr __sync_lock_test_and_set_41083; NO-ATOMIC-NEXT: adda.l #12, %sp1084; NO-ATOMIC-NEXT: rts1085;1086; NO-ATOMIC-PIC-LABEL: atomicrmw_xchg_i32:1087; NO-ATOMIC-PIC: .cfi_startproc1088; NO-ATOMIC-PIC-NEXT: ; %bb.0: ; %entry1089; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp1090; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -161091; NO-ATOMIC-PIC-NEXT: move.l (16,%sp), (4,%sp)1092; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (%sp)1093; NO-ATOMIC-PIC-NEXT: jsr (__sync_lock_test_and_set_4@PLT,%pc)1094; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp1095; NO-ATOMIC-PIC-NEXT: rts1096;1097; ATOMIC-LABEL: atomicrmw_xchg_i32:1098; ATOMIC: .cfi_startproc1099; ATOMIC-NEXT: ; %bb.0: ; %entry1100; ATOMIC-NEXT: suba.l #8, %sp1101; ATOMIC-NEXT: .cfi_def_cfa_offset -121102; ATOMIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill1103; ATOMIC-NEXT: move.l (12,%sp), %d11104; ATOMIC-NEXT: move.l (16,%sp), %a01105; ATOMIC-NEXT: move.l (%a0), %d21106; ATOMIC-NEXT: move.l %d2, %d01107; ATOMIC-NEXT: .LBB11_1: ; %atomicrmw.start1108; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=11109; ATOMIC-NEXT: cas.l %d0, %d1, (%a0)1110; ATOMIC-NEXT: move.l %d0, %d31111; ATOMIC-NEXT: sub.l %d2, %d31112; ATOMIC-NEXT: seq %d21113; ATOMIC-NEXT: and.b #1, %d21114; ATOMIC-NEXT: cmpi.b #0, %d21115; ATOMIC-NEXT: move.l %d0, %d21116; ATOMIC-NEXT: beq .LBB11_11117; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end1118; ATOMIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload1119; ATOMIC-NEXT: adda.l #8, %sp1120; ATOMIC-NEXT: rts1121;1122; ATOMIC-PIC-LABEL: atomicrmw_xchg_i32:1123; ATOMIC-PIC: .cfi_startproc1124; ATOMIC-PIC-NEXT: ; %bb.0: ; %entry1125; ATOMIC-PIC-NEXT: suba.l #8, %sp1126; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -121127; ATOMIC-PIC-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill1128; ATOMIC-PIC-NEXT: move.l (12,%sp), %d11129; ATOMIC-PIC-NEXT: move.l (16,%sp), %a01130; ATOMIC-PIC-NEXT: move.l (%a0), %d21131; ATOMIC-PIC-NEXT: move.l %d2, %d01132; ATOMIC-PIC-NEXT: .LBB11_1: ; %atomicrmw.start1133; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=11134; ATOMIC-PIC-NEXT: cas.l %d0, %d1, (%a0)1135; ATOMIC-PIC-NEXT: move.l %d0, %d31136; ATOMIC-PIC-NEXT: sub.l %d2, %d31137; ATOMIC-PIC-NEXT: seq %d21138; ATOMIC-PIC-NEXT: and.b #1, %d21139; ATOMIC-PIC-NEXT: cmpi.b #0, %d21140; ATOMIC-PIC-NEXT: move.l %d0, %d21141; ATOMIC-PIC-NEXT: beq .LBB11_11142; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end1143; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload1144; ATOMIC-PIC-NEXT: adda.l #8, %sp1145; ATOMIC-PIC-NEXT: rts1146entry:1147 %old = atomicrmw xchg ptr %ptr, i32 %val monotonic1148 ret i32 %old1149}1150 1151define i8 @atomicrmw_sub_i8_arid(ptr align 2 %self) {1152; NO-ATOMIC-LABEL: atomicrmw_sub_i8_arid:1153; NO-ATOMIC: .cfi_startproc1154; NO-ATOMIC-NEXT: ; %bb.0: ; %start1155; NO-ATOMIC-NEXT: suba.l #12, %sp1156; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -161157; NO-ATOMIC-NEXT: move.l (16,%sp), %a01158; NO-ATOMIC-NEXT: move.l (%a0), %d01159; NO-ATOMIC-NEXT: add.l #4, %d01160; NO-ATOMIC-NEXT: move.l %d0, (%sp)1161; NO-ATOMIC-NEXT: move.l #1, (4,%sp)1162; NO-ATOMIC-NEXT: jsr __sync_fetch_and_sub_11163; NO-ATOMIC-NEXT: adda.l #12, %sp1164; NO-ATOMIC-NEXT: rts1165;1166; NO-ATOMIC-PIC-LABEL: atomicrmw_sub_i8_arid:1167; NO-ATOMIC-PIC: .cfi_startproc1168; NO-ATOMIC-PIC-NEXT: ; %bb.0: ; %start1169; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp1170; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -161171; NO-ATOMIC-PIC-NEXT: move.l (16,%sp), %a01172; NO-ATOMIC-PIC-NEXT: move.l (%a0), %d01173; NO-ATOMIC-PIC-NEXT: add.l #4, %d01174; NO-ATOMIC-PIC-NEXT: move.l %d0, (%sp)1175; NO-ATOMIC-PIC-NEXT: move.l #1, (4,%sp)1176; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_sub_1@PLT,%pc)1177; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp1178; NO-ATOMIC-PIC-NEXT: rts1179;1180; ATOMIC-LABEL: atomicrmw_sub_i8_arid:1181; ATOMIC: .cfi_startproc1182; ATOMIC-NEXT: ; %bb.0: ; %start1183; ATOMIC-NEXT: suba.l #4, %sp1184; ATOMIC-NEXT: .cfi_def_cfa_offset -81185; ATOMIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill1186; ATOMIC-NEXT: move.l (8,%sp), %a01187; ATOMIC-NEXT: move.l (%a0), %a01188; ATOMIC-NEXT: move.b (4,%a0), %d11189; ATOMIC-NEXT: move.b %d1, %d01190; ATOMIC-NEXT: .LBB12_1: ; %atomicrmw.start1191; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=11192; ATOMIC-NEXT: move.b %d1, %d21193; ATOMIC-NEXT: add.b #-1, %d21194; ATOMIC-NEXT: cas.b %d0, %d2, (4,%a0)1195; ATOMIC-NEXT: move.b %d0, %d21196; ATOMIC-NEXT: sub.b %d1, %d21197; ATOMIC-NEXT: seq %d11198; ATOMIC-NEXT: and.b #1, %d11199; ATOMIC-NEXT: cmpi.b #0, %d11200; ATOMIC-NEXT: move.b %d0, %d11201; ATOMIC-NEXT: beq .LBB12_11202; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end1203; ATOMIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload1204; ATOMIC-NEXT: adda.l #4, %sp1205; ATOMIC-NEXT: rts1206;1207; ATOMIC-PIC-LABEL: atomicrmw_sub_i8_arid:1208; ATOMIC-PIC: .cfi_startproc1209; ATOMIC-PIC-NEXT: ; %bb.0: ; %start1210; ATOMIC-PIC-NEXT: suba.l #4, %sp1211; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -81212; ATOMIC-PIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill1213; ATOMIC-PIC-NEXT: move.l (8,%sp), %a01214; ATOMIC-PIC-NEXT: move.l (%a0), %a01215; ATOMIC-PIC-NEXT: move.b (4,%a0), %d11216; ATOMIC-PIC-NEXT: move.b %d1, %d01217; ATOMIC-PIC-NEXT: .LBB12_1: ; %atomicrmw.start1218; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=11219; ATOMIC-PIC-NEXT: move.b %d1, %d21220; ATOMIC-PIC-NEXT: add.b #-1, %d21221; ATOMIC-PIC-NEXT: cas.b %d0, %d2, (4,%a0)1222; ATOMIC-PIC-NEXT: move.b %d0, %d21223; ATOMIC-PIC-NEXT: sub.b %d1, %d21224; ATOMIC-PIC-NEXT: seq %d11225; ATOMIC-PIC-NEXT: and.b #1, %d11226; ATOMIC-PIC-NEXT: cmpi.b #0, %d11227; ATOMIC-PIC-NEXT: move.b %d0, %d11228; ATOMIC-PIC-NEXT: beq .LBB12_11229; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end1230; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload1231; ATOMIC-PIC-NEXT: adda.l #4, %sp1232; ATOMIC-PIC-NEXT: rts1233start:1234 %self1 = load ptr, ptr %self, align 21235 %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 41236 %6 = atomicrmw sub ptr %_18.i.i, i8 1 release, align 41237 ret i8 %61238}1239 1240define i16 @atomicrmw_sub_i16_arid(ptr align 2 %self) {1241; NO-ATOMIC-LABEL: atomicrmw_sub_i16_arid:1242; NO-ATOMIC: .cfi_startproc1243; NO-ATOMIC-NEXT: ; %bb.0: ; %start1244; NO-ATOMIC-NEXT: suba.l #12, %sp1245; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -161246; NO-ATOMIC-NEXT: move.l (16,%sp), %a01247; NO-ATOMIC-NEXT: move.l (%a0), %d01248; NO-ATOMIC-NEXT: add.l #4, %d01249; NO-ATOMIC-NEXT: move.l %d0, (%sp)1250; NO-ATOMIC-NEXT: move.l #1, (4,%sp)1251; NO-ATOMIC-NEXT: jsr __sync_fetch_and_sub_21252; NO-ATOMIC-NEXT: adda.l #12, %sp1253; NO-ATOMIC-NEXT: rts1254;1255; NO-ATOMIC-PIC-LABEL: atomicrmw_sub_i16_arid:1256; NO-ATOMIC-PIC: .cfi_startproc1257; NO-ATOMIC-PIC-NEXT: ; %bb.0: ; %start1258; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp1259; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -161260; NO-ATOMIC-PIC-NEXT: move.l (16,%sp), %a01261; NO-ATOMIC-PIC-NEXT: move.l (%a0), %d01262; NO-ATOMIC-PIC-NEXT: add.l #4, %d01263; NO-ATOMIC-PIC-NEXT: move.l %d0, (%sp)1264; NO-ATOMIC-PIC-NEXT: move.l #1, (4,%sp)1265; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_sub_2@PLT,%pc)1266; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp1267; NO-ATOMIC-PIC-NEXT: rts1268;1269; ATOMIC-LABEL: atomicrmw_sub_i16_arid:1270; ATOMIC: .cfi_startproc1271; ATOMIC-NEXT: ; %bb.0: ; %start1272; ATOMIC-NEXT: suba.l #4, %sp1273; ATOMIC-NEXT: .cfi_def_cfa_offset -81274; ATOMIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill1275; ATOMIC-NEXT: move.l (8,%sp), %a01276; ATOMIC-NEXT: move.l (%a0), %a01277; ATOMIC-NEXT: move.w (4,%a0), %d11278; ATOMIC-NEXT: move.w %d1, %d01279; ATOMIC-NEXT: .LBB13_1: ; %atomicrmw.start1280; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=11281; ATOMIC-NEXT: move.w %d1, %d21282; ATOMIC-NEXT: add.w #-1, %d21283; ATOMIC-NEXT: cas.w %d0, %d2, (4,%a0)1284; ATOMIC-NEXT: move.w %d0, %d21285; ATOMIC-NEXT: sub.w %d1, %d21286; ATOMIC-NEXT: seq %d11287; ATOMIC-NEXT: and.b #1, %d11288; ATOMIC-NEXT: cmpi.b #0, %d11289; ATOMIC-NEXT: move.w %d0, %d11290; ATOMIC-NEXT: beq .LBB13_11291; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end1292; ATOMIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload1293; ATOMIC-NEXT: adda.l #4, %sp1294; ATOMIC-NEXT: rts1295;1296; ATOMIC-PIC-LABEL: atomicrmw_sub_i16_arid:1297; ATOMIC-PIC: .cfi_startproc1298; ATOMIC-PIC-NEXT: ; %bb.0: ; %start1299; ATOMIC-PIC-NEXT: suba.l #4, %sp1300; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -81301; ATOMIC-PIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill1302; ATOMIC-PIC-NEXT: move.l (8,%sp), %a01303; ATOMIC-PIC-NEXT: move.l (%a0), %a01304; ATOMIC-PIC-NEXT: move.w (4,%a0), %d11305; ATOMIC-PIC-NEXT: move.w %d1, %d01306; ATOMIC-PIC-NEXT: .LBB13_1: ; %atomicrmw.start1307; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=11308; ATOMIC-PIC-NEXT: move.w %d1, %d21309; ATOMIC-PIC-NEXT: add.w #-1, %d21310; ATOMIC-PIC-NEXT: cas.w %d0, %d2, (4,%a0)1311; ATOMIC-PIC-NEXT: move.w %d0, %d21312; ATOMIC-PIC-NEXT: sub.w %d1, %d21313; ATOMIC-PIC-NEXT: seq %d11314; ATOMIC-PIC-NEXT: and.b #1, %d11315; ATOMIC-PIC-NEXT: cmpi.b #0, %d11316; ATOMIC-PIC-NEXT: move.w %d0, %d11317; ATOMIC-PIC-NEXT: beq .LBB13_11318; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end1319; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload1320; ATOMIC-PIC-NEXT: adda.l #4, %sp1321; ATOMIC-PIC-NEXT: rts1322start:1323 %self1 = load ptr, ptr %self, align 21324 %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 41325 %6 = atomicrmw sub ptr %_18.i.i, i16 1 release, align 41326 ret i16 %61327}1328 1329define i32 @atomicrmw_sub_i32_arid(ptr align 2 %self) {1330; NO-ATOMIC-LABEL: atomicrmw_sub_i32_arid:1331; NO-ATOMIC: .cfi_startproc1332; NO-ATOMIC-NEXT: ; %bb.0: ; %start1333; NO-ATOMIC-NEXT: suba.l #12, %sp1334; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -161335; NO-ATOMIC-NEXT: move.l (16,%sp), %a01336; NO-ATOMIC-NEXT: move.l (%a0), %d01337; NO-ATOMIC-NEXT: add.l #4, %d01338; NO-ATOMIC-NEXT: move.l %d0, (%sp)1339; NO-ATOMIC-NEXT: move.l #1, (4,%sp)1340; NO-ATOMIC-NEXT: jsr __sync_fetch_and_sub_41341; NO-ATOMIC-NEXT: adda.l #12, %sp1342; NO-ATOMIC-NEXT: rts1343;1344; NO-ATOMIC-PIC-LABEL: atomicrmw_sub_i32_arid:1345; NO-ATOMIC-PIC: .cfi_startproc1346; NO-ATOMIC-PIC-NEXT: ; %bb.0: ; %start1347; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp1348; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -161349; NO-ATOMIC-PIC-NEXT: move.l (16,%sp), %a01350; NO-ATOMIC-PIC-NEXT: move.l (%a0), %d01351; NO-ATOMIC-PIC-NEXT: add.l #4, %d01352; NO-ATOMIC-PIC-NEXT: move.l %d0, (%sp)1353; NO-ATOMIC-PIC-NEXT: move.l #1, (4,%sp)1354; NO-ATOMIC-PIC-NEXT: jsr (__sync_fetch_and_sub_4@PLT,%pc)1355; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp1356; NO-ATOMIC-PIC-NEXT: rts1357;1358; ATOMIC-LABEL: atomicrmw_sub_i32_arid:1359; ATOMIC: .cfi_startproc1360; ATOMIC-NEXT: ; %bb.0: ; %start1361; ATOMIC-NEXT: suba.l #4, %sp1362; ATOMIC-NEXT: .cfi_def_cfa_offset -81363; ATOMIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill1364; ATOMIC-NEXT: move.l (8,%sp), %a01365; ATOMIC-NEXT: move.l (%a0), %a01366; ATOMIC-NEXT: move.l (4,%a0), %d11367; ATOMIC-NEXT: move.l %d1, %d01368; ATOMIC-NEXT: .LBB14_1: ; %atomicrmw.start1369; ATOMIC-NEXT: ; =>This Inner Loop Header: Depth=11370; ATOMIC-NEXT: move.l %d1, %d21371; ATOMIC-NEXT: add.l #-1, %d21372; ATOMIC-NEXT: cas.l %d0, %d2, (4,%a0)1373; ATOMIC-NEXT: move.l %d0, %d21374; ATOMIC-NEXT: sub.l %d1, %d21375; ATOMIC-NEXT: seq %d11376; ATOMIC-NEXT: and.b #1, %d11377; ATOMIC-NEXT: cmpi.b #0, %d11378; ATOMIC-NEXT: move.l %d0, %d11379; ATOMIC-NEXT: beq .LBB14_11380; ATOMIC-NEXT: ; %bb.2: ; %atomicrmw.end1381; ATOMIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload1382; ATOMIC-NEXT: adda.l #4, %sp1383; ATOMIC-NEXT: rts1384;1385; ATOMIC-PIC-LABEL: atomicrmw_sub_i32_arid:1386; ATOMIC-PIC: .cfi_startproc1387; ATOMIC-PIC-NEXT: ; %bb.0: ; %start1388; ATOMIC-PIC-NEXT: suba.l #4, %sp1389; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -81390; ATOMIC-PIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill1391; ATOMIC-PIC-NEXT: move.l (8,%sp), %a01392; ATOMIC-PIC-NEXT: move.l (%a0), %a01393; ATOMIC-PIC-NEXT: move.l (4,%a0), %d11394; ATOMIC-PIC-NEXT: move.l %d1, %d01395; ATOMIC-PIC-NEXT: .LBB14_1: ; %atomicrmw.start1396; ATOMIC-PIC-NEXT: ; =>This Inner Loop Header: Depth=11397; ATOMIC-PIC-NEXT: move.l %d1, %d21398; ATOMIC-PIC-NEXT: add.l #-1, %d21399; ATOMIC-PIC-NEXT: cas.l %d0, %d2, (4,%a0)1400; ATOMIC-PIC-NEXT: move.l %d0, %d21401; ATOMIC-PIC-NEXT: sub.l %d1, %d21402; ATOMIC-PIC-NEXT: seq %d11403; ATOMIC-PIC-NEXT: and.b #1, %d11404; ATOMIC-PIC-NEXT: cmpi.b #0, %d11405; ATOMIC-PIC-NEXT: move.l %d0, %d11406; ATOMIC-PIC-NEXT: beq .LBB14_11407; ATOMIC-PIC-NEXT: ; %bb.2: ; %atomicrmw.end1408; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload1409; ATOMIC-PIC-NEXT: adda.l #4, %sp1410; ATOMIC-PIC-NEXT: rts1411start:1412 %self1 = load ptr, ptr %self, align 21413 %_18.i.i = getelementptr inbounds i8, ptr %self1, i32 41414 %6 = atomicrmw sub ptr %_18.i.i, i32 1 release, align 41415 ret i32 %61416}1417