1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC 3; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 --code-model=large | FileCheck %s --check-prefix=NO-ATOMIC 4; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC 5; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=NO-ATOMIC-PIC 6; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 --code-model=large | FileCheck %s --check-prefix=ATOMIC 7; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 --code-model=large | FileCheck %s --check-prefix=ATOMIC 8; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 --code-model=large | FileCheck %s --check-prefix=ATOMIC 9; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC 10; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC 11; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 --code-model=large --relocation-model=pic | FileCheck %s --check-prefix=ATOMIC-PIC 12 13@thread_id = internal global <{ [5 x i8] }> <{ [5 x i8] zeroinitializer}>, align 4 14 15define { i32, i1 } @std_thread_new() { 16; NO-ATOMIC-LABEL: std_thread_new: 17; NO-ATOMIC: .cfi_startproc 18; NO-ATOMIC-NEXT: ; %bb.0: ; %start 19; NO-ATOMIC-NEXT: suba.l #12, %sp 20; NO-ATOMIC-NEXT: .cfi_def_cfa_offset -16 21; 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_4 25; NO-ATOMIC-NEXT: cmpi.l #0, %d0 26; NO-ATOMIC-NEXT: seq %d1 27; NO-ATOMIC-NEXT: adda.l #12, %sp 28; NO-ATOMIC-NEXT: rts 29; 30; NO-ATOMIC-PIC-LABEL: std_thread_new: 31; NO-ATOMIC-PIC: .cfi_startproc 32; NO-ATOMIC-PIC-NEXT: ; %bb.0: ; %start 33; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp 34; NO-ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -16 35; NO-ATOMIC-PIC-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0 36; NO-ATOMIC-PIC-NEXT: adda.l #thread_id@GOTOFF, %a0 37; 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, %d0 42; NO-ATOMIC-PIC-NEXT: seq %d1 43; NO-ATOMIC-PIC-NEXT: adda.l #12, %sp 44; NO-ATOMIC-PIC-NEXT: rts 45; 46; ATOMIC-LABEL: std_thread_new: 47; ATOMIC: .cfi_startproc 48; ATOMIC-NEXT: ; %bb.0: ; %start 49; ATOMIC-NEXT: move.l #thread_id, %a0 50; ATOMIC-NEXT: moveq #1, %d1 51; ATOMIC-NEXT: moveq #0, %d0 52; ATOMIC-NEXT: cas.l %d0, %d1, (%a0) 53; ATOMIC-NEXT: cmpi.l #0, %d0 54; ATOMIC-NEXT: seq %d1 55; ATOMIC-NEXT: rts 56; 57; ATOMIC-PIC-LABEL: std_thread_new: 58; ATOMIC-PIC: .cfi_startproc 59; ATOMIC-PIC-NEXT: ; %bb.0: ; %start 60; ATOMIC-PIC-NEXT: suba.l #4, %sp 61; ATOMIC-PIC-NEXT: .cfi_def_cfa_offset -8 62; ATOMIC-PIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill 63; ATOMIC-PIC-NEXT: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0 64; ATOMIC-PIC-NEXT: move.l #thread_id@GOTOFF, %d1 65; ATOMIC-PIC-NEXT: moveq #1, %d2 66; ATOMIC-PIC-NEXT: moveq #0, %d0 67; ATOMIC-PIC-NEXT: cas.l %d0, %d2, (0,%a0,%d1) 68; ATOMIC-PIC-NEXT: cmpi.l #0, %d0 69; ATOMIC-PIC-NEXT: seq %d1 70; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload 71; ATOMIC-PIC-NEXT: adda.l #4, %sp 72; ATOMIC-PIC-NEXT: rts 73start: 74 %1 = cmpxchg ptr @thread_id, i32 0, i32 1 acquire monotonic, align 4 75 ret { i32, i1 } %1 76} 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, %sp 82; NO-ATOMIC-NEXT: movem.l %d2, (16,%sp) ; 8-byte Folded Spill 83; NO-ATOMIC-NEXT: move.b (31,%sp), %d0 84; NO-ATOMIC-NEXT: and.l #255, %d0 85; NO-ATOMIC-NEXT: move.l %d0, (8,%sp) 86; NO-ATOMIC-NEXT: move.b (27,%sp), %d2 87; NO-ATOMIC-NEXT: move.l %d2, %d0 88; NO-ATOMIC-NEXT: and.l #255, %d0 89; 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_1 92; NO-ATOMIC-NEXT: sub.b %d2, %d0 93; NO-ATOMIC-NEXT: seq %d0 94; NO-ATOMIC-NEXT: movem.l (16,%sp), %d2 ; 8-byte Folded Reload 95; NO-ATOMIC-NEXT: adda.l #20, %sp 96; NO-ATOMIC-NEXT: rts 97; 98; NO-ATOMIC-PIC-LABEL: cmpxchg_i8_monotonic_monotonic: 99; NO-ATOMIC-PIC: ; %bb.0: 100; NO-ATOMIC-PIC-NEXT: suba.l #20, %sp 101; NO-ATOMIC-PIC-NEXT: movem.l %d2, (16,%sp) ; 8-byte Folded Spill 102; NO-ATOMIC-PIC-NEXT: move.b (31,%sp), %d0 103; NO-ATOMIC-PIC-NEXT: and.l #255, %d0 104; NO-ATOMIC-PIC-NEXT: move.l %d0, (8,%sp) 105; NO-ATOMIC-PIC-NEXT: move.b (27,%sp), %d2 106; NO-ATOMIC-PIC-NEXT: move.l %d2, %d0 107; NO-ATOMIC-PIC-NEXT: and.l #255, %d0 108; 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, %d0 112; NO-ATOMIC-PIC-NEXT: seq %d0 113; NO-ATOMIC-PIC-NEXT: movem.l (16,%sp), %d2 ; 8-byte Folded Reload 114; NO-ATOMIC-PIC-NEXT: adda.l #20, %sp 115; NO-ATOMIC-PIC-NEXT: rts 116; 117; ATOMIC-LABEL: cmpxchg_i8_monotonic_monotonic: 118; ATOMIC: ; %bb.0: 119; ATOMIC-NEXT: suba.l #4, %sp 120; ATOMIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill 121; ATOMIC-NEXT: move.l (16,%sp), %a0 122; ATOMIC-NEXT: move.b (15,%sp), %d0 123; ATOMIC-NEXT: move.b (11,%sp), %d1 124; ATOMIC-NEXT: move.b %d1, %d2 125; ATOMIC-NEXT: cas.b %d2, %d0, (%a0) 126; ATOMIC-NEXT: sub.b %d1, %d2 127; ATOMIC-NEXT: seq %d0 128; ATOMIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload 129; ATOMIC-NEXT: adda.l #4, %sp 130; ATOMIC-NEXT: rts 131; 132; ATOMIC-PIC-LABEL: cmpxchg_i8_monotonic_monotonic: 133; ATOMIC-PIC: ; %bb.0: 134; ATOMIC-PIC-NEXT: suba.l #4, %sp 135; ATOMIC-PIC-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill 136; ATOMIC-PIC-NEXT: move.l (16,%sp), %a0 137; ATOMIC-PIC-NEXT: move.b (15,%sp), %d0 138; ATOMIC-PIC-NEXT: move.b (11,%sp), %d1 139; ATOMIC-PIC-NEXT: move.b %d1, %d2 140; ATOMIC-PIC-NEXT: cas.b %d2, %d0, (%a0) 141; ATOMIC-PIC-NEXT: sub.b %d1, %d2 142; ATOMIC-PIC-NEXT: seq %d0 143; ATOMIC-PIC-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload 144; ATOMIC-PIC-NEXT: adda.l #4, %sp 145; ATOMIC-PIC-NEXT: rts 146 %res = cmpxchg ptr %mem, i8 %cmp, i8 %new monotonic monotonic 147 %val = extractvalue {i8, i1} %res, 1 148 ret i1 %val 149} 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, %sp 155; NO-ATOMIC-NEXT: move.w (22,%sp), %d0 156; NO-ATOMIC-NEXT: and.l #65535, %d0 157; NO-ATOMIC-NEXT: move.l %d0, (8,%sp) 158; NO-ATOMIC-NEXT: move.w (18,%sp), %d0 159; NO-ATOMIC-NEXT: and.l #65535, %d0 160; 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_2 163; NO-ATOMIC-NEXT: adda.l #12, %sp 164; NO-ATOMIC-NEXT: rts 165; 166; NO-ATOMIC-PIC-LABEL: cmpxchg_i16_release_monotonic: 167; NO-ATOMIC-PIC: ; %bb.0: 168; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp 169; NO-ATOMIC-PIC-NEXT: move.w (22,%sp), %d0 170; NO-ATOMIC-PIC-NEXT: and.l #65535, %d0 171; NO-ATOMIC-PIC-NEXT: move.l %d0, (8,%sp) 172; NO-ATOMIC-PIC-NEXT: move.w (18,%sp), %d0 173; NO-ATOMIC-PIC-NEXT: and.l #65535, %d0 174; 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, %sp 178; NO-ATOMIC-PIC-NEXT: rts 179; 180; ATOMIC-LABEL: cmpxchg_i16_release_monotonic: 181; ATOMIC: ; %bb.0: 182; ATOMIC-NEXT: move.l (12,%sp), %a0 183; ATOMIC-NEXT: move.w (10,%sp), %d1 184; ATOMIC-NEXT: move.w (6,%sp), %d0 185; ATOMIC-NEXT: cas.w %d0, %d1, (%a0) 186; ATOMIC-NEXT: rts 187; 188; ATOMIC-PIC-LABEL: cmpxchg_i16_release_monotonic: 189; ATOMIC-PIC: ; %bb.0: 190; ATOMIC-PIC-NEXT: move.l (12,%sp), %a0 191; ATOMIC-PIC-NEXT: move.w (10,%sp), %d1 192; ATOMIC-PIC-NEXT: move.w (6,%sp), %d0 193; ATOMIC-PIC-NEXT: cas.w %d0, %d1, (%a0) 194; ATOMIC-PIC-NEXT: rts 195 %res = cmpxchg ptr %mem, i16 %cmp, i16 %new release monotonic 196 %val = extractvalue {i16, i1} %res, 0 197 ret i16 %val 198} 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, %sp 204; 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_4 208; NO-ATOMIC-NEXT: adda.l #12, %sp 209; NO-ATOMIC-NEXT: rts 210; 211; NO-ATOMIC-PIC-LABEL: cmpxchg_i32_release_acquire: 212; NO-ATOMIC-PIC: ; %bb.0: 213; NO-ATOMIC-PIC-NEXT: suba.l #12, %sp 214; 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, %sp 219; NO-ATOMIC-PIC-NEXT: rts 220; 221; ATOMIC-LABEL: cmpxchg_i32_release_acquire: 222; ATOMIC: ; %bb.0: 223; ATOMIC-NEXT: move.l (12,%sp), %a0 224; ATOMIC-NEXT: move.l (8,%sp), %d1 225; ATOMIC-NEXT: move.l (4,%sp), %d0 226; ATOMIC-NEXT: cas.l %d0, %d1, (%a0) 227; ATOMIC-NEXT: rts 228; 229; ATOMIC-PIC-LABEL: cmpxchg_i32_release_acquire: 230; ATOMIC-PIC: ; %bb.0: 231; ATOMIC-PIC-NEXT: move.l (12,%sp), %a0 232; ATOMIC-PIC-NEXT: move.l (8,%sp), %d1 233; ATOMIC-PIC-NEXT: move.l (4,%sp), %d0 234; ATOMIC-PIC-NEXT: cas.l %d0, %d1, (%a0) 235; ATOMIC-PIC-NEXT: rts 236 %res = cmpxchg ptr %mem, i32 %cmp, i32 %new release acquire 237 %val = extractvalue {i32, i1} %res, 0 238 ret i32 %val 239} 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, %sp 245; 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), %a0 248; 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_8 255; NO-ATOMIC-NEXT: move.l (28,%sp), %d1 256; NO-ATOMIC-NEXT: move.l (24,%sp), %d0 257; NO-ATOMIC-NEXT: adda.l #36, %sp 258; NO-ATOMIC-NEXT: rts 259; 260; NO-ATOMIC-PIC-LABEL: cmpxchg_i64_seqcst_seqcst: 261; NO-ATOMIC-PIC: ; %bb.0: 262; NO-ATOMIC-PIC-NEXT: suba.l #36, %sp 263; 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), %a0 266; 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), %d1 274; NO-ATOMIC-PIC-NEXT: move.l (24,%sp), %d0 275; NO-ATOMIC-PIC-NEXT: adda.l #36, %sp 276; NO-ATOMIC-PIC-NEXT: rts 277; 278; ATOMIC-LABEL: cmpxchg_i64_seqcst_seqcst: 279; ATOMIC: ; %bb.0: 280; ATOMIC-NEXT: suba.l #36, %sp 281; ATOMIC-NEXT: move.l (44,%sp), (28,%sp) 282; ATOMIC-NEXT: move.l (40,%sp), (24,%sp) 283; ATOMIC-NEXT: lea (24,%sp), %a0 284; 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_8 291; ATOMIC-NEXT: move.l (28,%sp), %d1 292; ATOMIC-NEXT: move.l (24,%sp), %d0 293; ATOMIC-NEXT: adda.l #36, %sp 294; ATOMIC-NEXT: rts 295; 296; ATOMIC-PIC-LABEL: cmpxchg_i64_seqcst_seqcst: 297; ATOMIC-PIC: ; %bb.0: 298; ATOMIC-PIC-NEXT: suba.l #36, %sp 299; 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), %a0 302; 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), %d1 310; ATOMIC-PIC-NEXT: move.l (24,%sp), %d0 311; ATOMIC-PIC-NEXT: adda.l #36, %sp 312; ATOMIC-PIC-NEXT: rts 313 %res = cmpxchg ptr %mem, i64 %cmp, i64 %new seq_cst seq_cst 314 %val = extractvalue {i64, i1} %res, 0 315 ret i64 %val 316} 317