317 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC3; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC4; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC5; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC6; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 --code-model=large | FileCheck %s --check-prefix=ATOMIC7; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 --code-model=large | FileCheck %s --check-prefix=ATOMIC8; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 --code-model=large | FileCheck %s --check-prefix=ATOMIC9; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC10; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC11; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC12 13@thread_id = internal global <{ [5 x i8] }> <{ [5 x i8] zeroinitializer}>, align 414 15define { i32, i1 } @std_thread_new() {16; NO-ATOMIC-LABEL: std_thread_new:17; NO-ATOMIC: .cfi_startproc18; NO-ATOMIC-NEXT: ; %bb.0: ; %start19; NO-ATOMIC-NEXT: suba.l #12, %sp20; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -1621; NO-ATOMIC-NEXT: move.l #1, (8,%sp)22; NO-ATOMIC-NEXT: move.l #0, (4,%sp)23; NO-ATOMIC-NEXT: move.l #thread_id, (%sp)24; NO-ATOMIC-NEXT: jsr __sync_val_compare_and_swap_425; NO-ATOMIC-NEXT: cmpi.l #0, %d026; NO-ATOMIC-NEXT: seq %d127; NO-ATOMIC-NEXT: adda.l #12, %sp28; NO-ATOMIC-NEXT: rts29;30; NO-ATOMIC-PIC-LABEL: std_thread_new:31; NO-ATOMIC-PIC: .cfi_startproc32; NO-ATOMIC-PIC-NEXT: ; %bb.0: ; %start33; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp34; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -1635; NO-ATOMIC-PIC-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a036; NO-ATOMIC-PIC-NEXT: adda.l #thread_id@GOTOFF, %a037; NO-ATOMIC-PIC-NEXT: move.l %a0, (%sp)38; NO-ATOMIC-PIC-NEXT: move.l #1, (8,%sp)39; NO-ATOMIC-PIC-NEXT: move.l #0, (4,%sp)40; NO-ATOMIC-PIC-NEXT: jsr (__sync_val_compare_and_swap_4@PLT,%pc)41; NO-ATOMIC-PIC-NEXT: cmpi.l #0, %d042; NO-ATOMIC-PIC-NEXT: seq %d143; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp44; NO-ATOMIC-PIC-NEXT: rts45;46; ATOMIC-LABEL: std_thread_new:47; ATOMIC: .cfi_startproc48; ATOMIC-NEXT: ; %bb.0: ; %start49; ATOMIC-NEXT: move.l #thread_id, %a050; ATOMIC-NEXT: moveq #1, %d151; ATOMIC-NEXT: moveq #0, %d052; ATOMIC-NEXT: cas.l %d0, %d1, (%a0)53; ATOMIC-NEXT: cmpi.l #0, %d054; ATOMIC-NEXT: seq %d155; ATOMIC-NEXT: rts56;57; ATOMIC-PIC-LABEL: std_thread_new:58; ATOMIC-PIC: .cfi_startproc59; ATOMIC-PIC-NEXT: ; %bb.0: ; %start60; ATOMIC-PIC-NEXT: suba.l #4, %sp61; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -862; ATOMIC-PIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill63; ATOMIC-PIC-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a064; ATOMIC-PIC-NEXT: move.l #thread_id@GOTOFF, %d165; ATOMIC-PIC-NEXT: moveq #1, %d266; ATOMIC-PIC-NEXT: moveq #0, %d067; ATOMIC-PIC-NEXT: cas.l %d0, %d2, (0,%a0,%d1)68; ATOMIC-PIC-NEXT: cmpi.l #0, %d069; ATOMIC-PIC-NEXT: seq %d170; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload71; ATOMIC-PIC-NEXT: adda.l #4, %sp72; ATOMIC-PIC-NEXT: rts73start:74 %1 = cmpxchg ptr @thread_id, i32 0, i32 1 acquire monotonic, align 475 ret { i32, i1 } %176}77 78define i1 @cmpxchg_i8_monotonic_monotonic(i8 %cmp, i8 %new, ptr %mem) nounwind {79; NO-ATOMIC-LABEL: cmpxchg_i8_monotonic_monotonic:80; NO-ATOMIC: ; %bb.0:81; NO-ATOMIC-NEXT: suba.l #20, %sp82; NO-ATOMIC-NEXT: movem.l %d2, (16,%sp) ; 8-byte Folded Spill83; NO-ATOMIC-NEXT: move.b (31,%sp), %d084; NO-ATOMIC-NEXT: and.l #255, %d085; NO-ATOMIC-NEXT: move.l %d0, (8,%sp)86; NO-ATOMIC-NEXT: move.b (27,%sp), %d287; NO-ATOMIC-NEXT: move.l %d2, %d088; NO-ATOMIC-NEXT: and.l #255, %d089; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)90; NO-ATOMIC-NEXT: move.l (32,%sp), (%sp)91; NO-ATOMIC-NEXT: jsr __sync_val_compare_and_swap_192; NO-ATOMIC-NEXT: sub.b %d2, %d093; NO-ATOMIC-NEXT: seq %d094; NO-ATOMIC-NEXT: movem.l (16,%sp), %d2 ; 8-byte Folded Reload95; NO-ATOMIC-NEXT: adda.l #20, %sp96; NO-ATOMIC-NEXT: rts97;98; NO-ATOMIC-PIC-LABEL: cmpxchg_i8_monotonic_monotonic:99; NO-ATOMIC-PIC: ; %bb.0:100; NO-ATOMIC-PIC-NEXT: suba.l #20, %sp101; NO-ATOMIC-PIC-NEXT: movem.l %d2, (16,%sp) ; 8-byte Folded Spill102; NO-ATOMIC-PIC-NEXT: move.b (31,%sp), %d0103; NO-ATOMIC-PIC-NEXT: and.l #255, %d0104; NO-ATOMIC-PIC-NEXT: move.l %d0, (8,%sp)105; NO-ATOMIC-PIC-NEXT: move.b (27,%sp), %d2106; NO-ATOMIC-PIC-NEXT: move.l %d2, %d0107; NO-ATOMIC-PIC-NEXT: and.l #255, %d0108; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)109; NO-ATOMIC-PIC-NEXT: move.l (32,%sp), (%sp)110; NO-ATOMIC-PIC-NEXT: jsr (__sync_val_compare_and_swap_1@PLT,%pc)111; NO-ATOMIC-PIC-NEXT: sub.b %d2, %d0112; NO-ATOMIC-PIC-NEXT: seq %d0113; NO-ATOMIC-PIC-NEXT: movem.l (16,%sp), %d2 ; 8-byte Folded Reload114; NO-ATOMIC-PIC-NEXT: adda.l #20, %sp115; NO-ATOMIC-PIC-NEXT: rts116;117; ATOMIC-LABEL: cmpxchg_i8_monotonic_monotonic:118; ATOMIC: ; %bb.0:119; ATOMIC-NEXT: suba.l #4, %sp120; ATOMIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill121; ATOMIC-NEXT: move.l (16,%sp), %a0122; ATOMIC-NEXT: move.b (15,%sp), %d0123; ATOMIC-NEXT: move.b (11,%sp), %d1124; ATOMIC-NEXT: move.b %d1, %d2125; ATOMIC-NEXT: cas.b %d2, %d0, (%a0)126; ATOMIC-NEXT: sub.b %d1, %d2127; ATOMIC-NEXT: seq %d0128; ATOMIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload129; ATOMIC-NEXT: adda.l #4, %sp130; ATOMIC-NEXT: rts131;132; ATOMIC-PIC-LABEL: cmpxchg_i8_monotonic_monotonic:133; ATOMIC-PIC: ; %bb.0:134; ATOMIC-PIC-NEXT: suba.l #4, %sp135; ATOMIC-PIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill136; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0137; ATOMIC-PIC-NEXT: move.b (15,%sp), %d0138; ATOMIC-PIC-NEXT: move.b (11,%sp), %d1139; ATOMIC-PIC-NEXT: move.b %d1, %d2140; ATOMIC-PIC-NEXT: cas.b %d2, %d0, (%a0)141; ATOMIC-PIC-NEXT: sub.b %d1, %d2142; ATOMIC-PIC-NEXT: seq %d0143; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload144; ATOMIC-PIC-NEXT: adda.l #4, %sp145; ATOMIC-PIC-NEXT: rts146 %res = cmpxchg ptr %mem, i8 %cmp, i8 %new monotonic monotonic147 %val = extractvalue {i8, i1} %res, 1148 ret i1 %val149}150 151define i16 @cmpxchg_i16_release_monotonic(i16 %cmp, i16 %new, ptr %mem) nounwind {152; NO-ATOMIC-LABEL: cmpxchg_i16_release_monotonic:153; NO-ATOMIC: ; %bb.0:154; NO-ATOMIC-NEXT: suba.l #12, %sp155; NO-ATOMIC-NEXT: move.w (22,%sp), %d0156; NO-ATOMIC-NEXT: and.l #65535, %d0157; NO-ATOMIC-NEXT: move.l %d0, (8,%sp)158; NO-ATOMIC-NEXT: move.w (18,%sp), %d0159; NO-ATOMIC-NEXT: and.l #65535, %d0160; NO-ATOMIC-NEXT: move.l %d0, (4,%sp)161; NO-ATOMIC-NEXT: move.l (24,%sp), (%sp)162; NO-ATOMIC-NEXT: jsr __sync_val_compare_and_swap_2163; NO-ATOMIC-NEXT: adda.l #12, %sp164; NO-ATOMIC-NEXT: rts165;166; NO-ATOMIC-PIC-LABEL: cmpxchg_i16_release_monotonic:167; NO-ATOMIC-PIC: ; %bb.0:168; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp169; NO-ATOMIC-PIC-NEXT: move.w (22,%sp), %d0170; NO-ATOMIC-PIC-NEXT: and.l #65535, %d0171; NO-ATOMIC-PIC-NEXT: move.l %d0, (8,%sp)172; NO-ATOMIC-PIC-NEXT: move.w (18,%sp), %d0173; NO-ATOMIC-PIC-NEXT: and.l #65535, %d0174; NO-ATOMIC-PIC-NEXT: move.l %d0, (4,%sp)175; NO-ATOMIC-PIC-NEXT: move.l (24,%sp), (%sp)176; NO-ATOMIC-PIC-NEXT: jsr (__sync_val_compare_and_swap_2@PLT,%pc)177; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp178; NO-ATOMIC-PIC-NEXT: rts179;180; ATOMIC-LABEL: cmpxchg_i16_release_monotonic:181; ATOMIC: ; %bb.0:182; ATOMIC-NEXT: move.l (12,%sp), %a0183; ATOMIC-NEXT: move.w (10,%sp), %d1184; ATOMIC-NEXT: move.w (6,%sp), %d0185; ATOMIC-NEXT: cas.w %d0, %d1, (%a0)186; ATOMIC-NEXT: rts187;188; ATOMIC-PIC-LABEL: cmpxchg_i16_release_monotonic:189; ATOMIC-PIC: ; %bb.0:190; ATOMIC-PIC-NEXT: move.l (12,%sp), %a0191; ATOMIC-PIC-NEXT: move.w (10,%sp), %d1192; ATOMIC-PIC-NEXT: move.w (6,%sp), %d0193; ATOMIC-PIC-NEXT: cas.w %d0, %d1, (%a0)194; ATOMIC-PIC-NEXT: rts195 %res = cmpxchg ptr %mem, i16 %cmp, i16 %new release monotonic196 %val = extractvalue {i16, i1} %res, 0197 ret i16 %val198}199 200define i32 @cmpxchg_i32_release_acquire(i32 %cmp, i32 %new, ptr %mem) nounwind {201; NO-ATOMIC-LABEL: cmpxchg_i32_release_acquire:202; NO-ATOMIC: ; %bb.0:203; NO-ATOMIC-NEXT: suba.l #12, %sp204; NO-ATOMIC-NEXT: move.l (20,%sp), (8,%sp)205; NO-ATOMIC-NEXT: move.l (16,%sp), (4,%sp)206; NO-ATOMIC-NEXT: move.l (24,%sp), (%sp)207; NO-ATOMIC-NEXT: jsr __sync_val_compare_and_swap_4208; NO-ATOMIC-NEXT: adda.l #12, %sp209; NO-ATOMIC-NEXT: rts210;211; NO-ATOMIC-PIC-LABEL: cmpxchg_i32_release_acquire:212; NO-ATOMIC-PIC: ; %bb.0:213; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp214; NO-ATOMIC-PIC-NEXT: move.l (20,%sp), (8,%sp)215; NO-ATOMIC-PIC-NEXT: move.l (16,%sp), (4,%sp)216; NO-ATOMIC-PIC-NEXT: move.l (24,%sp), (%sp)217; NO-ATOMIC-PIC-NEXT: jsr (__sync_val_compare_and_swap_4@PLT,%pc)218; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp219; NO-ATOMIC-PIC-NEXT: rts220;221; ATOMIC-LABEL: cmpxchg_i32_release_acquire:222; ATOMIC: ; %bb.0:223; ATOMIC-NEXT: move.l (12,%sp), %a0224; ATOMIC-NEXT: move.l (8,%sp), %d1225; ATOMIC-NEXT: move.l (4,%sp), %d0226; ATOMIC-NEXT: cas.l %d0, %d1, (%a0)227; ATOMIC-NEXT: rts228;229; ATOMIC-PIC-LABEL: cmpxchg_i32_release_acquire:230; ATOMIC-PIC: ; %bb.0:231; ATOMIC-PIC-NEXT: move.l (12,%sp), %a0232; ATOMIC-PIC-NEXT: move.l (8,%sp), %d1233; ATOMIC-PIC-NEXT: move.l (4,%sp), %d0234; ATOMIC-PIC-NEXT: cas.l %d0, %d1, (%a0)235; ATOMIC-PIC-NEXT: rts236 %res = cmpxchg ptr %mem, i32 %cmp, i32 %new release acquire237 %val = extractvalue {i32, i1} %res, 0238 ret i32 %val239}240 241define i64 @cmpxchg_i64_seqcst_seqcst(i64 %cmp, i64 %new, ptr %mem) nounwind {242; NO-ATOMIC-LABEL: cmpxchg_i64_seqcst_seqcst:243; NO-ATOMIC: ; %bb.0:244; NO-ATOMIC-NEXT: suba.l #36, %sp245; NO-ATOMIC-NEXT: move.l (44,%sp), (28,%sp)246; NO-ATOMIC-NEXT: move.l (40,%sp), (24,%sp)247; NO-ATOMIC-NEXT: lea (24,%sp), %a0248; NO-ATOMIC-NEXT: move.l %a0, (4,%sp)249; NO-ATOMIC-NEXT: move.l #5, (20,%sp)250; NO-ATOMIC-NEXT: move.l #5, (16,%sp)251; NO-ATOMIC-NEXT: move.l (52,%sp), (12,%sp)252; NO-ATOMIC-NEXT: move.l (48,%sp), (8,%sp)253; NO-ATOMIC-NEXT: move.l (56,%sp), (%sp)254; NO-ATOMIC-NEXT: jsr __atomic_compare_exchange_8255; NO-ATOMIC-NEXT: move.l (28,%sp), %d1256; NO-ATOMIC-NEXT: move.l (24,%sp), %d0257; NO-ATOMIC-NEXT: adda.l #36, %sp258; NO-ATOMIC-NEXT: rts259;260; NO-ATOMIC-PIC-LABEL: cmpxchg_i64_seqcst_seqcst:261; NO-ATOMIC-PIC: ; %bb.0:262; NO-ATOMIC-PIC-NEXT: suba.l #36, %sp263; NO-ATOMIC-PIC-NEXT: move.l (44,%sp), (28,%sp)264; NO-ATOMIC-PIC-NEXT: move.l (40,%sp), (24,%sp)265; NO-ATOMIC-PIC-NEXT: lea (24,%sp), %a0266; NO-ATOMIC-PIC-NEXT: move.l %a0, (4,%sp)267; NO-ATOMIC-PIC-NEXT: move.l #5, (20,%sp)268; NO-ATOMIC-PIC-NEXT: move.l #5, (16,%sp)269; NO-ATOMIC-PIC-NEXT: move.l (52,%sp), (12,%sp)270; NO-ATOMIC-PIC-NEXT: move.l (48,%sp), (8,%sp)271; NO-ATOMIC-PIC-NEXT: move.l (56,%sp), (%sp)272; NO-ATOMIC-PIC-NEXT: jsr (__atomic_compare_exchange_8@PLT,%pc)273; NO-ATOMIC-PIC-NEXT: move.l (28,%sp), %d1274; NO-ATOMIC-PIC-NEXT: move.l (24,%sp), %d0275; NO-ATOMIC-PIC-NEXT: adda.l #36, %sp276; NO-ATOMIC-PIC-NEXT: rts277;278; ATOMIC-LABEL: cmpxchg_i64_seqcst_seqcst:279; ATOMIC: ; %bb.0:280; ATOMIC-NEXT: suba.l #36, %sp281; ATOMIC-NEXT: move.l (44,%sp), (28,%sp)282; ATOMIC-NEXT: move.l (40,%sp), (24,%sp)283; ATOMIC-NEXT: lea (24,%sp), %a0284; ATOMIC-NEXT: move.l %a0, (4,%sp)285; ATOMIC-NEXT: move.l #5, (20,%sp)286; ATOMIC-NEXT: move.l #5, (16,%sp)287; ATOMIC-NEXT: move.l (52,%sp), (12,%sp)288; ATOMIC-NEXT: move.l (48,%sp), (8,%sp)289; ATOMIC-NEXT: move.l (56,%sp), (%sp)290; ATOMIC-NEXT: jsr __atomic_compare_exchange_8291; ATOMIC-NEXT: move.l (28,%sp), %d1292; ATOMIC-NEXT: move.l (24,%sp), %d0293; ATOMIC-NEXT: adda.l #36, %sp294; ATOMIC-NEXT: rts295;296; ATOMIC-PIC-LABEL: cmpxchg_i64_seqcst_seqcst:297; ATOMIC-PIC: ; %bb.0:298; ATOMIC-PIC-NEXT: suba.l #36, %sp299; ATOMIC-PIC-NEXT: move.l (44,%sp), (28,%sp)300; ATOMIC-PIC-NEXT: move.l (40,%sp), (24,%sp)301; ATOMIC-PIC-NEXT: lea (24,%sp), %a0302; ATOMIC-PIC-NEXT: move.l %a0, (4,%sp)303; ATOMIC-PIC-NEXT: move.l #5, (20,%sp)304; ATOMIC-PIC-NEXT: move.l #5, (16,%sp)305; ATOMIC-PIC-NEXT: move.l (52,%sp), (12,%sp)306; ATOMIC-PIC-NEXT: move.l (48,%sp), (8,%sp)307; ATOMIC-PIC-NEXT: move.l (56,%sp), (%sp)308; ATOMIC-PIC-NEXT: jsr (__atomic_compare_exchange_8@PLT,%pc)309; ATOMIC-PIC-NEXT: move.l (28,%sp), %d1310; ATOMIC-PIC-NEXT: move.l (24,%sp), %d0311; ATOMIC-PIC-NEXT: adda.l #36, %sp312; ATOMIC-PIC-NEXT: rts313 %res = cmpxchg ptr %mem, i64 %cmp, i64 %new seq_cst seq_cst314 %val = extractvalue {i64, i1} %res, 0315 ret i64 %val316}317