1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc %s -o - -mtriple=m68k -mcpu=M68000 | FileCheck %s --check-prefix=NO-ATOMIC 3; RUN: llc %s -o - -mtriple=m68k -mcpu=M68010 | FileCheck %s --check-prefix=NO-ATOMIC 4; RUN: llc %s -o - -mtriple=m68k -mcpu=M68020 | FileCheck %s --check-prefix=ATOMIC 5; RUN: llc %s -o - -mtriple=m68k -mcpu=M68030 | FileCheck %s --check-prefix=ATOMIC 6; RUN: llc %s -o - -mtriple=m68k -mcpu=M68040 | FileCheck %s --check-prefix=ATOMIC 7 8define i8 @atomic_load_i8_unordered(ptr %a) nounwind { 9; NO-ATOMIC-LABEL: atomic_load_i8_unordered: 10; NO-ATOMIC: ; %bb.0: 11; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 12; NO-ATOMIC-NEXT: move.b (%a0), %d0 13; NO-ATOMIC-NEXT: rts 14; 15; ATOMIC-LABEL: atomic_load_i8_unordered: 16; ATOMIC: ; %bb.0: 17; ATOMIC-NEXT: move.l (4,%sp), %a0 18; ATOMIC-NEXT: move.b (%a0), %d0 19; ATOMIC-NEXT: rts 20 %1 = load atomic i8, ptr %a unordered, align 1 21 ret i8 %1 22} 23 24define i8 @atomic_load_i8_monotonic(ptr %a) nounwind { 25; NO-ATOMIC-LABEL: atomic_load_i8_monotonic: 26; NO-ATOMIC: ; %bb.0: 27; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 28; NO-ATOMIC-NEXT: move.b (%a0), %d0 29; NO-ATOMIC-NEXT: rts 30; 31; ATOMIC-LABEL: atomic_load_i8_monotonic: 32; ATOMIC: ; %bb.0: 33; ATOMIC-NEXT: move.l (4,%sp), %a0 34; ATOMIC-NEXT: move.b (%a0), %d0 35; ATOMIC-NEXT: rts 36 %1 = load atomic i8, ptr %a monotonic, align 1 37 ret i8 %1 38} 39 40define i8 @atomic_load_i8_acquire(ptr %a) nounwind { 41; NO-ATOMIC-LABEL: atomic_load_i8_acquire: 42; NO-ATOMIC: ; %bb.0: 43; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 44; NO-ATOMIC-NEXT: move.b (%a0), %d0 45; NO-ATOMIC-NEXT: rts 46; 47; ATOMIC-LABEL: atomic_load_i8_acquire: 48; ATOMIC: ; %bb.0: 49; ATOMIC-NEXT: move.l (4,%sp), %a0 50; ATOMIC-NEXT: move.b (%a0), %d0 51; ATOMIC-NEXT: rts 52 %1 = load atomic i8, ptr %a acquire, align 1 53 ret i8 %1 54} 55 56define i8 @atomic_load_i8_seq_cst(ptr %a) nounwind { 57; NO-ATOMIC-LABEL: atomic_load_i8_seq_cst: 58; NO-ATOMIC: ; %bb.0: 59; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 60; NO-ATOMIC-NEXT: move.b (%a0), %d0 61; NO-ATOMIC-NEXT: rts 62; 63; ATOMIC-LABEL: atomic_load_i8_seq_cst: 64; ATOMIC: ; %bb.0: 65; ATOMIC-NEXT: move.l (4,%sp), %a0 66; ATOMIC-NEXT: move.b (%a0), %d0 67; ATOMIC-NEXT: rts 68 %1 = load atomic i8, ptr %a seq_cst, align 1 69 ret i8 %1 70} 71 72define i16 @atomic_load_i16_unordered(ptr %a) nounwind { 73; NO-ATOMIC-LABEL: atomic_load_i16_unordered: 74; NO-ATOMIC: ; %bb.0: 75; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 76; NO-ATOMIC-NEXT: move.w (%a0), %d0 77; NO-ATOMIC-NEXT: rts 78; 79; ATOMIC-LABEL: atomic_load_i16_unordered: 80; ATOMIC: ; %bb.0: 81; ATOMIC-NEXT: move.l (4,%sp), %a0 82; ATOMIC-NEXT: move.w (%a0), %d0 83; ATOMIC-NEXT: rts 84 %1 = load atomic i16, ptr %a unordered, align 2 85 ret i16 %1 86} 87 88define i16 @atomic_load_i16_monotonic(ptr %a) nounwind { 89; NO-ATOMIC-LABEL: atomic_load_i16_monotonic: 90; NO-ATOMIC: ; %bb.0: 91; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 92; NO-ATOMIC-NEXT: move.w (%a0), %d0 93; NO-ATOMIC-NEXT: rts 94; 95; ATOMIC-LABEL: atomic_load_i16_monotonic: 96; ATOMIC: ; %bb.0: 97; ATOMIC-NEXT: move.l (4,%sp), %a0 98; ATOMIC-NEXT: move.w (%a0), %d0 99; ATOMIC-NEXT: rts 100 %1 = load atomic i16, ptr %a monotonic, align 2 101 ret i16 %1 102} 103 104define i16 @atomic_load_i16_acquire(ptr %a) nounwind { 105; NO-ATOMIC-LABEL: atomic_load_i16_acquire: 106; NO-ATOMIC: ; %bb.0: 107; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 108; NO-ATOMIC-NEXT: move.w (%a0), %d0 109; NO-ATOMIC-NEXT: rts 110; 111; ATOMIC-LABEL: atomic_load_i16_acquire: 112; ATOMIC: ; %bb.0: 113; ATOMIC-NEXT: move.l (4,%sp), %a0 114; ATOMIC-NEXT: move.w (%a0), %d0 115; ATOMIC-NEXT: rts 116 %1 = load atomic i16, ptr %a acquire, align 2 117 ret i16 %1 118} 119 120define i16 @atomic_load_i16_seq_cst(ptr %a) nounwind { 121; NO-ATOMIC-LABEL: atomic_load_i16_seq_cst: 122; NO-ATOMIC: ; %bb.0: 123; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 124; NO-ATOMIC-NEXT: move.w (%a0), %d0 125; NO-ATOMIC-NEXT: rts 126; 127; ATOMIC-LABEL: atomic_load_i16_seq_cst: 128; ATOMIC: ; %bb.0: 129; ATOMIC-NEXT: move.l (4,%sp), %a0 130; ATOMIC-NEXT: move.w (%a0), %d0 131; ATOMIC-NEXT: rts 132 %1 = load atomic i16, ptr %a seq_cst, align 2 133 ret i16 %1 134} 135 136define i32 @atomic_load_i32_unordered(ptr %a) nounwind { 137; NO-ATOMIC-LABEL: atomic_load_i32_unordered: 138; NO-ATOMIC: ; %bb.0: 139; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 140; NO-ATOMIC-NEXT: move.l (%a0), %d0 141; NO-ATOMIC-NEXT: rts 142; 143; ATOMIC-LABEL: atomic_load_i32_unordered: 144; ATOMIC: ; %bb.0: 145; ATOMIC-NEXT: move.l (4,%sp), %a0 146; ATOMIC-NEXT: move.l (%a0), %d0 147; ATOMIC-NEXT: rts 148 %1 = load atomic i32, ptr %a unordered, align 4 149 ret i32 %1 150} 151 152define i32 @atomic_load_i32_monotonic(ptr %a) nounwind { 153; NO-ATOMIC-LABEL: atomic_load_i32_monotonic: 154; NO-ATOMIC: ; %bb.0: 155; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 156; NO-ATOMIC-NEXT: move.l (%a0), %d0 157; NO-ATOMIC-NEXT: rts 158; 159; ATOMIC-LABEL: atomic_load_i32_monotonic: 160; ATOMIC: ; %bb.0: 161; ATOMIC-NEXT: move.l (4,%sp), %a0 162; ATOMIC-NEXT: move.l (%a0), %d0 163; ATOMIC-NEXT: rts 164 %1 = load atomic i32, ptr %a monotonic, align 4 165 ret i32 %1 166} 167 168define i32 @atomic_load_i32_acquire(ptr %a) nounwind { 169; NO-ATOMIC-LABEL: atomic_load_i32_acquire: 170; NO-ATOMIC: ; %bb.0: 171; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 172; NO-ATOMIC-NEXT: move.l (%a0), %d0 173; NO-ATOMIC-NEXT: rts 174; 175; ATOMIC-LABEL: atomic_load_i32_acquire: 176; ATOMIC: ; %bb.0: 177; ATOMIC-NEXT: move.l (4,%sp), %a0 178; ATOMIC-NEXT: move.l (%a0), %d0 179; ATOMIC-NEXT: rts 180 %1 = load atomic i32, ptr %a acquire, align 4 181 ret i32 %1 182} 183 184define i32 @atomic_load_i32_seq_cst(ptr %a) nounwind { 185; NO-ATOMIC-LABEL: atomic_load_i32_seq_cst: 186; NO-ATOMIC: ; %bb.0: 187; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 188; NO-ATOMIC-NEXT: move.l (%a0), %d0 189; NO-ATOMIC-NEXT: rts 190; 191; ATOMIC-LABEL: atomic_load_i32_seq_cst: 192; ATOMIC: ; %bb.0: 193; ATOMIC-NEXT: move.l (4,%sp), %a0 194; ATOMIC-NEXT: move.l (%a0), %d0 195; ATOMIC-NEXT: rts 196 %1 = load atomic i32, ptr %a seq_cst, align 4 197 ret i32 %1 198} 199 200define i64 @atomic_load_i64_unordered(ptr %a) nounwind { 201; NO-ATOMIC-LABEL: atomic_load_i64_unordered: 202; NO-ATOMIC: ; %bb.0: 203; NO-ATOMIC-NEXT: suba.l #12, %sp 204; NO-ATOMIC-NEXT: move.l #0, (4,%sp) 205; NO-ATOMIC-NEXT: move.l (16,%sp), (%sp) 206; NO-ATOMIC-NEXT: jsr __atomic_load_8 207; NO-ATOMIC-NEXT: adda.l #12, %sp 208; NO-ATOMIC-NEXT: rts 209; 210; ATOMIC-LABEL: atomic_load_i64_unordered: 211; ATOMIC: ; %bb.0: 212; ATOMIC-NEXT: suba.l #12, %sp 213; ATOMIC-NEXT: move.l #0, (4,%sp) 214; ATOMIC-NEXT: move.l (16,%sp), (%sp) 215; ATOMIC-NEXT: jsr __atomic_load_8 216; ATOMIC-NEXT: adda.l #12, %sp 217; ATOMIC-NEXT: rts 218 %1 = load atomic i64, ptr %a unordered, align 8 219 ret i64 %1 220} 221 222define i64 @atomic_load_i64_monotonic(ptr %a) nounwind { 223; NO-ATOMIC-LABEL: atomic_load_i64_monotonic: 224; NO-ATOMIC: ; %bb.0: 225; NO-ATOMIC-NEXT: suba.l #12, %sp 226; NO-ATOMIC-NEXT: move.l #0, (4,%sp) 227; NO-ATOMIC-NEXT: move.l (16,%sp), (%sp) 228; NO-ATOMIC-NEXT: jsr __atomic_load_8 229; NO-ATOMIC-NEXT: adda.l #12, %sp 230; NO-ATOMIC-NEXT: rts 231; 232; ATOMIC-LABEL: atomic_load_i64_monotonic: 233; ATOMIC: ; %bb.0: 234; ATOMIC-NEXT: suba.l #12, %sp 235; ATOMIC-NEXT: move.l #0, (4,%sp) 236; ATOMIC-NEXT: move.l (16,%sp), (%sp) 237; ATOMIC-NEXT: jsr __atomic_load_8 238; ATOMIC-NEXT: adda.l #12, %sp 239; ATOMIC-NEXT: rts 240 %1 = load atomic i64, ptr %a monotonic, align 8 241 ret i64 %1 242} 243 244define i64 @atomic_load_i64_acquire(ptr %a) nounwind { 245; NO-ATOMIC-LABEL: atomic_load_i64_acquire: 246; NO-ATOMIC: ; %bb.0: 247; NO-ATOMIC-NEXT: suba.l #12, %sp 248; NO-ATOMIC-NEXT: move.l #2, (4,%sp) 249; NO-ATOMIC-NEXT: move.l (16,%sp), (%sp) 250; NO-ATOMIC-NEXT: jsr __atomic_load_8 251; NO-ATOMIC-NEXT: adda.l #12, %sp 252; NO-ATOMIC-NEXT: rts 253; 254; ATOMIC-LABEL: atomic_load_i64_acquire: 255; ATOMIC: ; %bb.0: 256; ATOMIC-NEXT: suba.l #12, %sp 257; ATOMIC-NEXT: move.l #2, (4,%sp) 258; ATOMIC-NEXT: move.l (16,%sp), (%sp) 259; ATOMIC-NEXT: jsr __atomic_load_8 260; ATOMIC-NEXT: adda.l #12, %sp 261; ATOMIC-NEXT: rts 262 %1 = load atomic i64, ptr %a acquire, align 8 263 ret i64 %1 264} 265 266define i64 @atomic_load_i64_seq_cst(ptr %a) nounwind { 267; NO-ATOMIC-LABEL: atomic_load_i64_seq_cst: 268; NO-ATOMIC: ; %bb.0: 269; NO-ATOMIC-NEXT: suba.l #12, %sp 270; NO-ATOMIC-NEXT: move.l #5, (4,%sp) 271; NO-ATOMIC-NEXT: move.l (16,%sp), (%sp) 272; NO-ATOMIC-NEXT: jsr __atomic_load_8 273; NO-ATOMIC-NEXT: adda.l #12, %sp 274; NO-ATOMIC-NEXT: rts 275; 276; ATOMIC-LABEL: atomic_load_i64_seq_cst: 277; ATOMIC: ; %bb.0: 278; ATOMIC-NEXT: suba.l #12, %sp 279; ATOMIC-NEXT: move.l #5, (4,%sp) 280; ATOMIC-NEXT: move.l (16,%sp), (%sp) 281; ATOMIC-NEXT: jsr __atomic_load_8 282; ATOMIC-NEXT: adda.l #12, %sp 283; ATOMIC-NEXT: rts 284 %1 = load atomic i64, ptr %a seq_cst, align 8 285 ret i64 %1 286} 287 288define void @atomic_store_i8_unordered(ptr %a, i8 %val) nounwind { 289; NO-ATOMIC-LABEL: atomic_store_i8_unordered: 290; NO-ATOMIC: ; %bb.0: 291; NO-ATOMIC-NEXT: move.b (11,%sp), %d0 292; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 293; NO-ATOMIC-NEXT: move.b %d0, (%a0) 294; NO-ATOMIC-NEXT: rts 295; 296; ATOMIC-LABEL: atomic_store_i8_unordered: 297; ATOMIC: ; %bb.0: 298; ATOMIC-NEXT: move.b (11,%sp), %d0 299; ATOMIC-NEXT: move.l (4,%sp), %a0 300; ATOMIC-NEXT: move.b %d0, (%a0) 301; ATOMIC-NEXT: rts 302 store atomic i8 %val, ptr %a unordered, align 1 303 ret void 304} 305 306define void @atomic_store_i8_monotonic(ptr %a, i8 %val) nounwind { 307; NO-ATOMIC-LABEL: atomic_store_i8_monotonic: 308; NO-ATOMIC: ; %bb.0: 309; NO-ATOMIC-NEXT: move.b (11,%sp), %d0 310; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 311; NO-ATOMIC-NEXT: move.b %d0, (%a0) 312; NO-ATOMIC-NEXT: rts 313; 314; ATOMIC-LABEL: atomic_store_i8_monotonic: 315; ATOMIC: ; %bb.0: 316; ATOMIC-NEXT: move.b (11,%sp), %d0 317; ATOMIC-NEXT: move.l (4,%sp), %a0 318; ATOMIC-NEXT: move.b %d0, (%a0) 319; ATOMIC-NEXT: rts 320 store atomic i8 %val, ptr %a monotonic, align 1 321 ret void 322} 323 324define void @atomic_store_i8_release(ptr %a, i8 %val) nounwind { 325; NO-ATOMIC-LABEL: atomic_store_i8_release: 326; NO-ATOMIC: ; %bb.0: 327; NO-ATOMIC-NEXT: move.b (11,%sp), %d0 328; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 329; NO-ATOMIC-NEXT: move.b %d0, (%a0) 330; NO-ATOMIC-NEXT: rts 331; 332; ATOMIC-LABEL: atomic_store_i8_release: 333; ATOMIC: ; %bb.0: 334; ATOMIC-NEXT: move.b (11,%sp), %d0 335; ATOMIC-NEXT: move.l (4,%sp), %a0 336; ATOMIC-NEXT: move.b %d0, (%a0) 337; ATOMIC-NEXT: rts 338 store atomic i8 %val, ptr %a release, align 1 339 ret void 340} 341 342define void @atomic_store_i8_seq_cst(ptr %a, i8 %val) nounwind { 343; NO-ATOMIC-LABEL: atomic_store_i8_seq_cst: 344; NO-ATOMIC: ; %bb.0: 345; NO-ATOMIC-NEXT: move.b (11,%sp), %d0 346; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 347; NO-ATOMIC-NEXT: move.b %d0, (%a0) 348; NO-ATOMIC-NEXT: rts 349; 350; ATOMIC-LABEL: atomic_store_i8_seq_cst: 351; ATOMIC: ; %bb.0: 352; ATOMIC-NEXT: move.b (11,%sp), %d0 353; ATOMIC-NEXT: move.l (4,%sp), %a0 354; ATOMIC-NEXT: move.b %d0, (%a0) 355; ATOMIC-NEXT: rts 356 store atomic i8 %val, ptr %a seq_cst, align 1 357 ret void 358} 359 360define void @atomic_store_i16_unordered(ptr %a, i16 %val) nounwind { 361; NO-ATOMIC-LABEL: atomic_store_i16_unordered: 362; NO-ATOMIC: ; %bb.0: 363; NO-ATOMIC-NEXT: move.w (10,%sp), %d0 364; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 365; NO-ATOMIC-NEXT: move.w %d0, (%a0) 366; NO-ATOMIC-NEXT: rts 367; 368; ATOMIC-LABEL: atomic_store_i16_unordered: 369; ATOMIC: ; %bb.0: 370; ATOMIC-NEXT: move.w (10,%sp), %d0 371; ATOMIC-NEXT: move.l (4,%sp), %a0 372; ATOMIC-NEXT: move.w %d0, (%a0) 373; ATOMIC-NEXT: rts 374 store atomic i16 %val, ptr %a unordered, align 2 375 ret void 376} 377 378define void @atomic_store_i16_monotonic(ptr %a, i16 %val) nounwind { 379; NO-ATOMIC-LABEL: atomic_store_i16_monotonic: 380; NO-ATOMIC: ; %bb.0: 381; NO-ATOMIC-NEXT: move.w (10,%sp), %d0 382; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 383; NO-ATOMIC-NEXT: move.w %d0, (%a0) 384; NO-ATOMIC-NEXT: rts 385; 386; ATOMIC-LABEL: atomic_store_i16_monotonic: 387; ATOMIC: ; %bb.0: 388; ATOMIC-NEXT: move.w (10,%sp), %d0 389; ATOMIC-NEXT: move.l (4,%sp), %a0 390; ATOMIC-NEXT: move.w %d0, (%a0) 391; ATOMIC-NEXT: rts 392 store atomic i16 %val, ptr %a monotonic, align 2 393 ret void 394} 395 396define void @atomic_store_i16_release(ptr %a, i16 %val) nounwind { 397; NO-ATOMIC-LABEL: atomic_store_i16_release: 398; NO-ATOMIC: ; %bb.0: 399; NO-ATOMIC-NEXT: move.w (10,%sp), %d0 400; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 401; NO-ATOMIC-NEXT: move.w %d0, (%a0) 402; NO-ATOMIC-NEXT: rts 403; 404; ATOMIC-LABEL: atomic_store_i16_release: 405; ATOMIC: ; %bb.0: 406; ATOMIC-NEXT: move.w (10,%sp), %d0 407; ATOMIC-NEXT: move.l (4,%sp), %a0 408; ATOMIC-NEXT: move.w %d0, (%a0) 409; ATOMIC-NEXT: rts 410 store atomic i16 %val, ptr %a release, align 2 411 ret void 412} 413 414define void @atomic_store_i16_seq_cst(ptr %a, i16 %val) nounwind { 415; NO-ATOMIC-LABEL: atomic_store_i16_seq_cst: 416; NO-ATOMIC: ; %bb.0: 417; NO-ATOMIC-NEXT: move.w (10,%sp), %d0 418; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 419; NO-ATOMIC-NEXT: move.w %d0, (%a0) 420; NO-ATOMIC-NEXT: rts 421; 422; ATOMIC-LABEL: atomic_store_i16_seq_cst: 423; ATOMIC: ; %bb.0: 424; ATOMIC-NEXT: move.w (10,%sp), %d0 425; ATOMIC-NEXT: move.l (4,%sp), %a0 426; ATOMIC-NEXT: move.w %d0, (%a0) 427; ATOMIC-NEXT: rts 428 store atomic i16 %val, ptr %a seq_cst, align 2 429 ret void 430} 431 432define void @atomic_store_i32_unordered(ptr %a, i32 %val) nounwind { 433; NO-ATOMIC-LABEL: atomic_store_i32_unordered: 434; NO-ATOMIC: ; %bb.0: 435; NO-ATOMIC-NEXT: move.l (8,%sp), %d0 436; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 437; NO-ATOMIC-NEXT: move.l %d0, (%a0) 438; NO-ATOMIC-NEXT: rts 439; 440; ATOMIC-LABEL: atomic_store_i32_unordered: 441; ATOMIC: ; %bb.0: 442; ATOMIC-NEXT: move.l (8,%sp), %d0 443; ATOMIC-NEXT: move.l (4,%sp), %a0 444; ATOMIC-NEXT: move.l %d0, (%a0) 445; ATOMIC-NEXT: rts 446 store atomic i32 %val, ptr %a unordered, align 4 447 ret void 448} 449 450define void @atomic_store_i32_monotonic(ptr %a, i32 %val) nounwind { 451; NO-ATOMIC-LABEL: atomic_store_i32_monotonic: 452; NO-ATOMIC: ; %bb.0: 453; NO-ATOMIC-NEXT: move.l (8,%sp), %d0 454; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 455; NO-ATOMIC-NEXT: move.l %d0, (%a0) 456; NO-ATOMIC-NEXT: rts 457; 458; ATOMIC-LABEL: atomic_store_i32_monotonic: 459; ATOMIC: ; %bb.0: 460; ATOMIC-NEXT: move.l (8,%sp), %d0 461; ATOMIC-NEXT: move.l (4,%sp), %a0 462; ATOMIC-NEXT: move.l %d0, (%a0) 463; ATOMIC-NEXT: rts 464 store atomic i32 %val, ptr %a monotonic, align 4 465 ret void 466} 467 468define void @atomic_store_i32_release(ptr %a, i32 %val) nounwind { 469; NO-ATOMIC-LABEL: atomic_store_i32_release: 470; NO-ATOMIC: ; %bb.0: 471; NO-ATOMIC-NEXT: move.l (8,%sp), %d0 472; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 473; NO-ATOMIC-NEXT: move.l %d0, (%a0) 474; NO-ATOMIC-NEXT: rts 475; 476; ATOMIC-LABEL: atomic_store_i32_release: 477; ATOMIC: ; %bb.0: 478; ATOMIC-NEXT: move.l (8,%sp), %d0 479; ATOMIC-NEXT: move.l (4,%sp), %a0 480; ATOMIC-NEXT: move.l %d0, (%a0) 481; ATOMIC-NEXT: rts 482 store atomic i32 %val, ptr %a release, align 4 483 ret void 484} 485 486define void @atomic_store_i32_seq_cst(ptr %a, i32 %val) nounwind { 487; NO-ATOMIC-LABEL: atomic_store_i32_seq_cst: 488; NO-ATOMIC: ; %bb.0: 489; NO-ATOMIC-NEXT: move.l (8,%sp), %d0 490; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 491; NO-ATOMIC-NEXT: move.l %d0, (%a0) 492; NO-ATOMIC-NEXT: rts 493; 494; ATOMIC-LABEL: atomic_store_i32_seq_cst: 495; ATOMIC: ; %bb.0: 496; ATOMIC-NEXT: move.l (8,%sp), %d0 497; ATOMIC-NEXT: move.l (4,%sp), %a0 498; ATOMIC-NEXT: move.l %d0, (%a0) 499; ATOMIC-NEXT: rts 500 store atomic i32 %val, ptr %a seq_cst, align 4 501 ret void 502} 503 504define void @atomic_store_i64_unordered(ptr %a, i64 %val) nounwind { 505; NO-ATOMIC-LABEL: atomic_store_i64_unordered: 506; NO-ATOMIC: ; %bb.0: 507; NO-ATOMIC-NEXT: suba.l #20, %sp 508; NO-ATOMIC-NEXT: move.l #0, (12,%sp) 509; NO-ATOMIC-NEXT: move.l (32,%sp), (8,%sp) 510; NO-ATOMIC-NEXT: move.l (28,%sp), (4,%sp) 511; NO-ATOMIC-NEXT: move.l (24,%sp), (%sp) 512; NO-ATOMIC-NEXT: jsr __atomic_store_8 513; NO-ATOMIC-NEXT: adda.l #20, %sp 514; NO-ATOMIC-NEXT: rts 515; 516; ATOMIC-LABEL: atomic_store_i64_unordered: 517; ATOMIC: ; %bb.0: 518; ATOMIC-NEXT: suba.l #20, %sp 519; ATOMIC-NEXT: move.l #0, (12,%sp) 520; ATOMIC-NEXT: move.l (32,%sp), (8,%sp) 521; ATOMIC-NEXT: move.l (28,%sp), (4,%sp) 522; ATOMIC-NEXT: move.l (24,%sp), (%sp) 523; ATOMIC-NEXT: jsr __atomic_store_8 524; ATOMIC-NEXT: adda.l #20, %sp 525; ATOMIC-NEXT: rts 526 store atomic i64 %val, ptr %a unordered, align 8 527 ret void 528} 529 530define void @atomic_store_i64_monotonic(ptr %a, i64 %val) nounwind { 531; NO-ATOMIC-LABEL: atomic_store_i64_monotonic: 532; NO-ATOMIC: ; %bb.0: 533; NO-ATOMIC-NEXT: suba.l #20, %sp 534; NO-ATOMIC-NEXT: move.l #0, (12,%sp) 535; NO-ATOMIC-NEXT: move.l (32,%sp), (8,%sp) 536; NO-ATOMIC-NEXT: move.l (28,%sp), (4,%sp) 537; NO-ATOMIC-NEXT: move.l (24,%sp), (%sp) 538; NO-ATOMIC-NEXT: jsr __atomic_store_8 539; NO-ATOMIC-NEXT: adda.l #20, %sp 540; NO-ATOMIC-NEXT: rts 541; 542; ATOMIC-LABEL: atomic_store_i64_monotonic: 543; ATOMIC: ; %bb.0: 544; ATOMIC-NEXT: suba.l #20, %sp 545; ATOMIC-NEXT: move.l #0, (12,%sp) 546; ATOMIC-NEXT: move.l (32,%sp), (8,%sp) 547; ATOMIC-NEXT: move.l (28,%sp), (4,%sp) 548; ATOMIC-NEXT: move.l (24,%sp), (%sp) 549; ATOMIC-NEXT: jsr __atomic_store_8 550; ATOMIC-NEXT: adda.l #20, %sp 551; ATOMIC-NEXT: rts 552 store atomic i64 %val, ptr %a monotonic, align 8 553 ret void 554} 555 556define void @atomic_store_i64_release(ptr %a, i64 %val) nounwind { 557; NO-ATOMIC-LABEL: atomic_store_i64_release: 558; NO-ATOMIC: ; %bb.0: 559; NO-ATOMIC-NEXT: suba.l #20, %sp 560; NO-ATOMIC-NEXT: move.l #3, (12,%sp) 561; NO-ATOMIC-NEXT: move.l (32,%sp), (8,%sp) 562; NO-ATOMIC-NEXT: move.l (28,%sp), (4,%sp) 563; NO-ATOMIC-NEXT: move.l (24,%sp), (%sp) 564; NO-ATOMIC-NEXT: jsr __atomic_store_8 565; NO-ATOMIC-NEXT: adda.l #20, %sp 566; NO-ATOMIC-NEXT: rts 567; 568; ATOMIC-LABEL: atomic_store_i64_release: 569; ATOMIC: ; %bb.0: 570; ATOMIC-NEXT: suba.l #20, %sp 571; ATOMIC-NEXT: move.l #3, (12,%sp) 572; ATOMIC-NEXT: move.l (32,%sp), (8,%sp) 573; ATOMIC-NEXT: move.l (28,%sp), (4,%sp) 574; ATOMIC-NEXT: move.l (24,%sp), (%sp) 575; ATOMIC-NEXT: jsr __atomic_store_8 576; ATOMIC-NEXT: adda.l #20, %sp 577; ATOMIC-NEXT: rts 578 store atomic i64 %val, ptr %a release, align 8 579 ret void 580} 581 582define void @atomic_store_i64_seq_cst(ptr %a, i64 %val) nounwind { 583; NO-ATOMIC-LABEL: atomic_store_i64_seq_cst: 584; NO-ATOMIC: ; %bb.0: 585; NO-ATOMIC-NEXT: suba.l #20, %sp 586; NO-ATOMIC-NEXT: move.l #5, (12,%sp) 587; NO-ATOMIC-NEXT: move.l (32,%sp), (8,%sp) 588; NO-ATOMIC-NEXT: move.l (28,%sp), (4,%sp) 589; NO-ATOMIC-NEXT: move.l (24,%sp), (%sp) 590; NO-ATOMIC-NEXT: jsr __atomic_store_8 591; NO-ATOMIC-NEXT: adda.l #20, %sp 592; NO-ATOMIC-NEXT: rts 593; 594; ATOMIC-LABEL: atomic_store_i64_seq_cst: 595; ATOMIC: ; %bb.0: 596; ATOMIC-NEXT: suba.l #20, %sp 597; ATOMIC-NEXT: move.l #5, (12,%sp) 598; ATOMIC-NEXT: move.l (32,%sp), (8,%sp) 599; ATOMIC-NEXT: move.l (28,%sp), (4,%sp) 600; ATOMIC-NEXT: move.l (24,%sp), (%sp) 601; ATOMIC-NEXT: jsr __atomic_store_8 602; ATOMIC-NEXT: adda.l #20, %sp 603; ATOMIC-NEXT: rts 604 store atomic i64 %val, ptr %a seq_cst, align 8 605 ret void 606} 607 608define void @store_arid(ptr nonnull align 4 %a) { 609; NO-ATOMIC-LABEL: store_arid: 610; NO-ATOMIC: .cfi_startproc 611; NO-ATOMIC-NEXT: ; %bb.0: ; %start 612; NO-ATOMIC-NEXT: moveq #1, %d0 613; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 614; NO-ATOMIC-NEXT: move.l %d0, (32,%a0) 615; NO-ATOMIC-NEXT: rts 616; 617; ATOMIC-LABEL: store_arid: 618; ATOMIC: .cfi_startproc 619; ATOMIC-NEXT: ; %bb.0: ; %start 620; ATOMIC-NEXT: moveq #1, %d0 621; ATOMIC-NEXT: move.l (4,%sp), %a0 622; ATOMIC-NEXT: move.l %d0, (32,%a0) 623; ATOMIC-NEXT: rts 624start: 625 %1 = getelementptr inbounds i32, ptr %a, i32 8 626 store atomic i32 1, ptr %1 seq_cst, align 4 627 br label %exit 628 629exit: ; preds = %start 630 ret void 631} 632 633define i32 @load_arid(ptr nonnull align 4 %a) { 634; NO-ATOMIC-LABEL: load_arid: 635; NO-ATOMIC: .cfi_startproc 636; NO-ATOMIC-NEXT: ; %bb.0: ; %start 637; NO-ATOMIC-NEXT: move.l (4,%sp), %a0 638; NO-ATOMIC-NEXT: move.l (32,%a0), %d0 639; NO-ATOMIC-NEXT: rts 640; 641; ATOMIC-LABEL: load_arid: 642; ATOMIC: .cfi_startproc 643; ATOMIC-NEXT: ; %bb.0: ; %start 644; ATOMIC-NEXT: move.l (4,%sp), %a0 645; ATOMIC-NEXT: move.l (32,%a0), %d0 646; ATOMIC-NEXT: rts 647start: 648 %1 = getelementptr inbounds i32, ptr %a, i32 8 649 %2 = load atomic i32, ptr %1 seq_cst, align 4 650 br label %exit 651 652exit: ; preds = %start 653 ret i32 %2 654} 655