1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s -check-prefixes=ARM 3; RUN: llc < %s -mtriple=armv7-apple-ios -O0 | FileCheck %s -check-prefix=ARMOPTNONE 4; RUN: llc < %s -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s -check-prefix=THUMBTWO 5; RUN: llc < %s -mtriple=thumbv6 | FileCheck %s -check-prefix=THUMBONE 6; RUN: llc < %s -mtriple=armv4 | FileCheck %s -check-prefix=ARMV4 7; RUN: llc < %s -mtriple=armv6 | FileCheck %s -check-prefix=ARMV6 8; RUN: llc < %s -mtriple=thumbv7m | FileCheck %s -check-prefix=THUMBM 9 10define void @test1(ptr %ptr, i32 %val1) { 11; ARM-LABEL: test1: 12; ARM: @ %bb.0: 13; ARM-NEXT: dmb ish 14; ARM-NEXT: str r1, [r0] 15; ARM-NEXT: dmb ish 16; ARM-NEXT: bx lr 17; 18; ARMOPTNONE-LABEL: test1: 19; ARMOPTNONE: @ %bb.0: 20; ARMOPTNONE-NEXT: dmb ish 21; ARMOPTNONE-NEXT: str r1, [r0] 22; ARMOPTNONE-NEXT: dmb ish 23; ARMOPTNONE-NEXT: bx lr 24; 25; THUMBTWO-LABEL: test1: 26; THUMBTWO: @ %bb.0: 27; THUMBTWO-NEXT: dmb ish 28; THUMBTWO-NEXT: str r1, [r0] 29; THUMBTWO-NEXT: dmb ish 30; THUMBTWO-NEXT: bx lr 31; 32; THUMBONE-LABEL: test1: 33; THUMBONE: @ %bb.0: 34; THUMBONE-NEXT: push {r7, lr} 35; THUMBONE-NEXT: bl __sync_lock_test_and_set_4 36; THUMBONE-NEXT: pop {r7, pc} 37; 38; ARMV4-LABEL: test1: 39; ARMV4: @ %bb.0: 40; ARMV4-NEXT: push {r11, lr} 41; ARMV4-NEXT: mov r2, #5 42; ARMV4-NEXT: bl __atomic_store_4 43; ARMV4-NEXT: pop {r11, lr} 44; ARMV4-NEXT: mov pc, lr 45; 46; ARMV6-LABEL: test1: 47; ARMV6: @ %bb.0: 48; ARMV6-NEXT: mov r2, #0 49; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 50; ARMV6-NEXT: str r1, [r0] 51; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 52; ARMV6-NEXT: bx lr 53; 54; THUMBM-LABEL: test1: 55; THUMBM: @ %bb.0: 56; THUMBM-NEXT: dmb sy 57; THUMBM-NEXT: str r1, [r0] 58; THUMBM-NEXT: dmb sy 59; THUMBM-NEXT: bx lr 60 store atomic i32 %val1, ptr %ptr seq_cst, align 4 61 ret void 62} 63 64define i32 @test2(ptr %ptr) { 65; ARM-LABEL: test2: 66; ARM: @ %bb.0: 67; ARM-NEXT: ldr r0, [r0] 68; ARM-NEXT: dmb ish 69; ARM-NEXT: bx lr 70; 71; ARMOPTNONE-LABEL: test2: 72; ARMOPTNONE: @ %bb.0: 73; ARMOPTNONE-NEXT: ldr r0, [r0] 74; ARMOPTNONE-NEXT: dmb ish 75; ARMOPTNONE-NEXT: bx lr 76; 77; THUMBTWO-LABEL: test2: 78; THUMBTWO: @ %bb.0: 79; THUMBTWO-NEXT: ldr r0, [r0] 80; THUMBTWO-NEXT: dmb ish 81; THUMBTWO-NEXT: bx lr 82; 83; THUMBONE-LABEL: test2: 84; THUMBONE: @ %bb.0: 85; THUMBONE-NEXT: push {r7, lr} 86; THUMBONE-NEXT: movs r1, #0 87; THUMBONE-NEXT: mov r2, r1 88; THUMBONE-NEXT: bl __sync_val_compare_and_swap_4 89; THUMBONE-NEXT: pop {r7, pc} 90; 91; ARMV4-LABEL: test2: 92; ARMV4: @ %bb.0: 93; ARMV4-NEXT: push {r11, lr} 94; ARMV4-NEXT: mov r1, #5 95; ARMV4-NEXT: bl __atomic_load_4 96; ARMV4-NEXT: pop {r11, lr} 97; ARMV4-NEXT: mov pc, lr 98; 99; ARMV6-LABEL: test2: 100; ARMV6: @ %bb.0: 101; ARMV6-NEXT: ldr r0, [r0] 102; ARMV6-NEXT: mov r1, #0 103; ARMV6-NEXT: mcr p15, #0, r1, c7, c10, #5 104; ARMV6-NEXT: bx lr 105; 106; THUMBM-LABEL: test2: 107; THUMBM: @ %bb.0: 108; THUMBM-NEXT: ldr r0, [r0] 109; THUMBM-NEXT: dmb sy 110; THUMBM-NEXT: bx lr 111 %val = load atomic i32, ptr %ptr seq_cst, align 4 112 ret i32 %val 113} 114 115define void @test3(ptr %ptr1, ptr %ptr2) { 116; ARM-LABEL: test3: 117; ARM: @ %bb.0: 118; ARM-NEXT: ldrb r0, [r0] 119; ARM-NEXT: strb r0, [r1] 120; ARM-NEXT: bx lr 121; 122; ARMOPTNONE-LABEL: test3: 123; ARMOPTNONE: @ %bb.0: 124; ARMOPTNONE-NEXT: ldrb r0, [r0] 125; ARMOPTNONE-NEXT: strb r0, [r1] 126; ARMOPTNONE-NEXT: bx lr 127; 128; THUMBTWO-LABEL: test3: 129; THUMBTWO: @ %bb.0: 130; THUMBTWO-NEXT: ldrb r0, [r0] 131; THUMBTWO-NEXT: strb r0, [r1] 132; THUMBTWO-NEXT: bx lr 133; 134; THUMBONE-LABEL: test3: 135; THUMBONE: @ %bb.0: 136; THUMBONE-NEXT: ldrb r0, [r0] 137; THUMBONE-NEXT: strb r0, [r1] 138; THUMBONE-NEXT: bx lr 139; 140; ARMV4-LABEL: test3: 141; ARMV4: @ %bb.0: 142; ARMV4-NEXT: push {r4, lr} 143; ARMV4-NEXT: mov r4, r1 144; ARMV4-NEXT: mov r1, #0 145; ARMV4-NEXT: bl __atomic_load_1 146; ARMV4-NEXT: mov r1, r0 147; ARMV4-NEXT: mov r0, r4 148; ARMV4-NEXT: mov r2, #0 149; ARMV4-NEXT: bl __atomic_store_1 150; ARMV4-NEXT: pop {r4, lr} 151; ARMV4-NEXT: mov pc, lr 152; 153; ARMV6-LABEL: test3: 154; ARMV6: @ %bb.0: 155; ARMV6-NEXT: ldrb r0, [r0] 156; ARMV6-NEXT: strb r0, [r1] 157; ARMV6-NEXT: bx lr 158; 159; THUMBM-LABEL: test3: 160; THUMBM: @ %bb.0: 161; THUMBM-NEXT: ldrb r0, [r0] 162; THUMBM-NEXT: strb r0, [r1] 163; THUMBM-NEXT: bx lr 164 165 166 167 %val = load atomic i8, ptr %ptr1 unordered, align 1 168 store atomic i8 %val, ptr %ptr2 unordered, align 1 169 ret void 170} 171 172define void @test4(ptr %ptr1, ptr %ptr2) { 173; ARM-LABEL: test4: 174; ARM: @ %bb.0: 175; ARM-NEXT: ldrb r0, [r0] 176; ARM-NEXT: dmb ish 177; ARM-NEXT: strb r0, [r1] 178; ARM-NEXT: dmb ish 179; ARM-NEXT: bx lr 180; 181; ARMOPTNONE-LABEL: test4: 182; ARMOPTNONE: @ %bb.0: 183; ARMOPTNONE-NEXT: ldrb r0, [r0] 184; ARMOPTNONE-NEXT: dmb ish 185; ARMOPTNONE-NEXT: dmb ish 186; ARMOPTNONE-NEXT: strb r0, [r1] 187; ARMOPTNONE-NEXT: dmb ish 188; ARMOPTNONE-NEXT: bx lr 189; 190; THUMBTWO-LABEL: test4: 191; THUMBTWO: @ %bb.0: 192; THUMBTWO-NEXT: ldrb r0, [r0] 193; THUMBTWO-NEXT: dmb ish 194; THUMBTWO-NEXT: dmb ish 195; THUMBTWO-NEXT: strb r0, [r1] 196; THUMBTWO-NEXT: dmb ish 197; THUMBTWO-NEXT: bx lr 198; 199; THUMBONE-LABEL: test4: 200; THUMBONE: @ %bb.0: 201; THUMBONE-NEXT: push {r4, lr} 202; THUMBONE-NEXT: mov r4, r1 203; THUMBONE-NEXT: movs r1, #0 204; THUMBONE-NEXT: mov r2, r1 205; THUMBONE-NEXT: bl __sync_val_compare_and_swap_1 206; THUMBONE-NEXT: mov r1, r0 207; THUMBONE-NEXT: mov r0, r4 208; THUMBONE-NEXT: bl __sync_lock_test_and_set_1 209; THUMBONE-NEXT: pop {r4, pc} 210; 211; ARMV4-LABEL: test4: 212; ARMV4: @ %bb.0: 213; ARMV4-NEXT: push {r4, lr} 214; ARMV4-NEXT: mov r4, r1 215; ARMV4-NEXT: mov r1, #5 216; ARMV4-NEXT: bl __atomic_load_1 217; ARMV4-NEXT: mov r1, r0 218; ARMV4-NEXT: mov r0, r4 219; ARMV4-NEXT: mov r2, #5 220; ARMV4-NEXT: bl __atomic_store_1 221; ARMV4-NEXT: pop {r4, lr} 222; ARMV4-NEXT: mov pc, lr 223; 224; ARMV6-LABEL: test4: 225; ARMV6: @ %bb.0: 226; ARMV6-NEXT: mov r2, #0 227; ARMV6-NEXT: ldrb r0, [r0] 228; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 229; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 230; ARMV6-NEXT: strb r0, [r1] 231; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 232; ARMV6-NEXT: bx lr 233; 234; THUMBM-LABEL: test4: 235; THUMBM: @ %bb.0: 236; THUMBM-NEXT: ldrb r0, [r0] 237; THUMBM-NEXT: dmb sy 238; THUMBM-NEXT: dmb sy 239; THUMBM-NEXT: strb r0, [r1] 240; THUMBM-NEXT: dmb sy 241; THUMBM-NEXT: bx lr 242 %val = load atomic i8, ptr %ptr1 seq_cst, align 1 243 store atomic i8 %val, ptr %ptr2 seq_cst, align 1 244 ret void 245} 246 247define i64 @test_old_load_64bit(ptr %p) { 248; ARM-LABEL: test_old_load_64bit: 249; ARM: @ %bb.0: 250; ARM-NEXT: ldrexd r0, r1, [r0] 251; ARM-NEXT: clrex 252; ARM-NEXT: dmb ish 253; ARM-NEXT: bx lr 254; 255; ARMOPTNONE-LABEL: test_old_load_64bit: 256; ARMOPTNONE: @ %bb.0: 257; ARMOPTNONE-NEXT: ldrexd r2, r3, [r0] 258; ARMOPTNONE-NEXT: mov r0, r2 259; ARMOPTNONE-NEXT: mov r1, r3 260; ARMOPTNONE-NEXT: clrex 261; ARMOPTNONE-NEXT: dmb ish 262; ARMOPTNONE-NEXT: bx lr 263; 264; THUMBTWO-LABEL: test_old_load_64bit: 265; THUMBTWO: @ %bb.0: 266; THUMBTWO-NEXT: ldrexd r0, r1, [r0] 267; THUMBTWO-NEXT: clrex 268; THUMBTWO-NEXT: dmb ish 269; THUMBTWO-NEXT: bx lr 270; 271; THUMBONE-LABEL: test_old_load_64bit: 272; THUMBONE: @ %bb.0: 273; THUMBONE-NEXT: push {r7, lr} 274; THUMBONE-NEXT: sub sp, #8 275; THUMBONE-NEXT: movs r2, #0 276; THUMBONE-NEXT: str r2, [sp] 277; THUMBONE-NEXT: str r2, [sp, #4] 278; THUMBONE-NEXT: mov r3, r2 279; THUMBONE-NEXT: bl __sync_val_compare_and_swap_8 280; THUMBONE-NEXT: add sp, #8 281; THUMBONE-NEXT: pop {r7, pc} 282; 283; ARMV4-LABEL: test_old_load_64bit: 284; ARMV4: @ %bb.0: 285; ARMV4-NEXT: push {r11, lr} 286; ARMV4-NEXT: mov r1, #5 287; ARMV4-NEXT: bl __atomic_load_8 288; ARMV4-NEXT: pop {r11, lr} 289; ARMV4-NEXT: mov pc, lr 290; 291; ARMV6-LABEL: test_old_load_64bit: 292; ARMV6: @ %bb.0: 293; ARMV6-NEXT: ldrexd r0, r1, [r0] 294; ARMV6-NEXT: mov r2, #0 295; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 296; ARMV6-NEXT: bx lr 297; 298; THUMBM-LABEL: test_old_load_64bit: 299; THUMBM: @ %bb.0: 300; THUMBM-NEXT: push {r7, lr} 301; THUMBM-NEXT: movs r1, #5 302; THUMBM-NEXT: bl __atomic_load_8 303; THUMBM-NEXT: pop {r7, pc} 304 %1 = load atomic i64, ptr %p seq_cst, align 8 305 ret i64 %1 306} 307 308define void @test_old_store_64bit(ptr %p, i64 %v) { 309; ARM-LABEL: test_old_store_64bit: 310; ARM: @ %bb.0: 311; ARM-NEXT: push {r4, r5, lr} 312; ARM-NEXT: mov r3, r2 313; ARM-NEXT: dmb ish 314; ARM-NEXT: mov r2, r1 315; ARM-NEXT: LBB5_1: @ %atomicrmw.start 316; ARM-NEXT: @ =>This Inner Loop Header: Depth=1 317; ARM-NEXT: ldrexd r4, r5, [r0] 318; ARM-NEXT: strexd r1, r2, r3, [r0] 319; ARM-NEXT: cmp r1, #0 320; ARM-NEXT: bne LBB5_1 321; ARM-NEXT: @ %bb.2: @ %atomicrmw.end 322; ARM-NEXT: dmb ish 323; ARM-NEXT: pop {r4, r5, pc} 324; 325; ARMOPTNONE-LABEL: test_old_store_64bit: 326; ARMOPTNONE: @ %bb.0: 327; ARMOPTNONE-NEXT: push {r4, r5, r7, r8, r10, r11, lr} 328; ARMOPTNONE-NEXT: add r7, sp, #20 329; ARMOPTNONE-NEXT: sub sp, sp, #24 330; ARMOPTNONE-NEXT: str r0, [sp, #4] @ 4-byte Spill 331; ARMOPTNONE-NEXT: str r2, [sp, #8] @ 4-byte Spill 332; ARMOPTNONE-NEXT: str r1, [sp, #12] @ 4-byte Spill 333; ARMOPTNONE-NEXT: dmb ish 334; ARMOPTNONE-NEXT: ldr r1, [r0] 335; ARMOPTNONE-NEXT: ldr r0, [r0, #4] 336; ARMOPTNONE-NEXT: str r1, [sp, #16] @ 4-byte Spill 337; ARMOPTNONE-NEXT: str r0, [sp, #20] @ 4-byte Spill 338; ARMOPTNONE-NEXT: b LBB5_1 339; ARMOPTNONE-NEXT: LBB5_1: @ %atomicrmw.start 340; ARMOPTNONE-NEXT: @ =>This Loop Header: Depth=1 341; ARMOPTNONE-NEXT: @ Child Loop BB5_2 Depth 2 342; ARMOPTNONE-NEXT: ldr r3, [sp, #20] @ 4-byte Reload 343; ARMOPTNONE-NEXT: ldr r2, [sp, #16] @ 4-byte Reload 344; ARMOPTNONE-NEXT: ldr r12, [sp, #8] @ 4-byte Reload 345; ARMOPTNONE-NEXT: ldr r0, [sp, #12] @ 4-byte Reload 346; ARMOPTNONE-NEXT: ldr r8, [sp, #4] @ 4-byte Reload 347; ARMOPTNONE-NEXT: str r3, [sp] @ 4-byte Spill 348; ARMOPTNONE-NEXT: @ implicit-def: $r1 349; ARMOPTNONE-NEXT: @ implicit-def: $r9 350; ARMOPTNONE-NEXT: @ kill: def $r8 killed $r8 def $r8_r9 351; ARMOPTNONE-NEXT: mov r9, r1 352; ARMOPTNONE-NEXT: @ kill: def $r0 killed $r0 def $r0_r1 353; ARMOPTNONE-NEXT: mov r1, r12 354; ARMOPTNONE-NEXT: mov r10, r2 355; ARMOPTNONE-NEXT: mov r11, r3 356; ARMOPTNONE-NEXT: LBB5_2: @ %atomicrmw.start 357; ARMOPTNONE-NEXT: @ Parent Loop BB5_1 Depth=1 358; ARMOPTNONE-NEXT: @ => This Inner Loop Header: Depth=2 359; ARMOPTNONE-NEXT: ldrexd r4, r5, [r8] 360; ARMOPTNONE-NEXT: cmp r4, r10 361; ARMOPTNONE-NEXT: cmpeq r5, r11 362; ARMOPTNONE-NEXT: bne LBB5_4 363; ARMOPTNONE-NEXT: @ %bb.3: @ %atomicrmw.start 364; ARMOPTNONE-NEXT: @ in Loop: Header=BB5_2 Depth=2 365; ARMOPTNONE-NEXT: strexd r9, r0, r1, [r8] 366; ARMOPTNONE-NEXT: cmp r9, #0 367; ARMOPTNONE-NEXT: bne LBB5_2 368; ARMOPTNONE-NEXT: LBB5_4: @ %atomicrmw.start 369; ARMOPTNONE-NEXT: @ in Loop: Header=BB5_1 Depth=1 370; ARMOPTNONE-NEXT: ldr r1, [sp] @ 4-byte Reload 371; ARMOPTNONE-NEXT: mov r0, r5 372; ARMOPTNONE-NEXT: eor r3, r0, r1 373; ARMOPTNONE-NEXT: mov r1, r4 374; ARMOPTNONE-NEXT: eor r2, r1, r2 375; ARMOPTNONE-NEXT: orr r2, r2, r3 376; ARMOPTNONE-NEXT: cmp r2, #0 377; ARMOPTNONE-NEXT: str r1, [sp, #16] @ 4-byte Spill 378; ARMOPTNONE-NEXT: str r0, [sp, #20] @ 4-byte Spill 379; ARMOPTNONE-NEXT: bne LBB5_1 380; ARMOPTNONE-NEXT: b LBB5_5 381; ARMOPTNONE-NEXT: LBB5_5: @ %atomicrmw.end 382; ARMOPTNONE-NEXT: dmb ish 383; ARMOPTNONE-NEXT: sub sp, r7, #20 384; ARMOPTNONE-NEXT: pop {r4, r5, r7, r8, r10, r11, pc} 385; 386; THUMBTWO-LABEL: test_old_store_64bit: 387; THUMBTWO: @ %bb.0: 388; THUMBTWO-NEXT: dmb ish 389; THUMBTWO-NEXT: LBB5_1: @ %atomicrmw.start 390; THUMBTWO-NEXT: @ =>This Inner Loop Header: Depth=1 391; THUMBTWO-NEXT: ldrexd r3, r9, [r0] 392; THUMBTWO-NEXT: strexd r3, r1, r2, [r0] 393; THUMBTWO-NEXT: cmp r3, #0 394; THUMBTWO-NEXT: bne LBB5_1 395; THUMBTWO-NEXT: @ %bb.2: @ %atomicrmw.end 396; THUMBTWO-NEXT: dmb ish 397; THUMBTWO-NEXT: bx lr 398; 399; THUMBONE-LABEL: test_old_store_64bit: 400; THUMBONE: @ %bb.0: 401; THUMBONE-NEXT: push {r7, lr} 402; THUMBONE-NEXT: bl __sync_lock_test_and_set_8 403; THUMBONE-NEXT: pop {r7, pc} 404; 405; ARMV4-LABEL: test_old_store_64bit: 406; ARMV4: @ %bb.0: 407; ARMV4-NEXT: push {r11, lr} 408; ARMV4-NEXT: sub sp, sp, #8 409; ARMV4-NEXT: mov r1, #5 410; ARMV4-NEXT: str r1, [sp] 411; ARMV4-NEXT: bl __atomic_store_8 412; ARMV4-NEXT: add sp, sp, #8 413; ARMV4-NEXT: pop {r11, lr} 414; ARMV4-NEXT: mov pc, lr 415; 416; ARMV6-LABEL: test_old_store_64bit: 417; ARMV6: @ %bb.0: 418; ARMV6-NEXT: push {r4, r5, r11, lr} 419; ARMV6-NEXT: @ kill: def $r3 killed $r3 killed $r2_r3 def $r2_r3 420; ARMV6-NEXT: mov r1, #0 421; ARMV6-NEXT: @ kill: def $r2 killed $r2 killed $r2_r3 def $r2_r3 422; ARMV6-NEXT: mcr p15, #0, r1, c7, c10, #5 423; ARMV6-NEXT: .LBB5_1: @ %atomicrmw.start 424; ARMV6-NEXT: @ =>This Inner Loop Header: Depth=1 425; ARMV6-NEXT: ldrexd r4, r5, [r0] 426; ARMV6-NEXT: strexd r1, r2, r3, [r0] 427; ARMV6-NEXT: cmp r1, #0 428; ARMV6-NEXT: bne .LBB5_1 429; ARMV6-NEXT: @ %bb.2: @ %atomicrmw.end 430; ARMV6-NEXT: mov r0, #0 431; ARMV6-NEXT: mcr p15, #0, r0, c7, c10, #5 432; ARMV6-NEXT: pop {r4, r5, r11, pc} 433; 434; THUMBM-LABEL: test_old_store_64bit: 435; THUMBM: @ %bb.0: 436; THUMBM-NEXT: push {r7, lr} 437; THUMBM-NEXT: sub sp, #8 438; THUMBM-NEXT: movs r1, #5 439; THUMBM-NEXT: str r1, [sp] 440; THUMBM-NEXT: bl __atomic_store_8 441; THUMBM-NEXT: add sp, #8 442; THUMBM-NEXT: pop {r7, pc} 443 store atomic i64 %v, ptr %p seq_cst, align 8 444 ret void 445} 446 447define half @load_atomic_f16__seq_cst(ptr %ptr) { 448; ARM-LABEL: load_atomic_f16__seq_cst: 449; ARM: @ %bb.0: 450; ARM-NEXT: ldrh r0, [r0] 451; ARM-NEXT: dmb ish 452; ARM-NEXT: bx lr 453; 454; ARMOPTNONE-LABEL: load_atomic_f16__seq_cst: 455; ARMOPTNONE: @ %bb.0: 456; ARMOPTNONE-NEXT: ldrh r0, [r0] 457; ARMOPTNONE-NEXT: dmb ish 458; ARMOPTNONE-NEXT: bx lr 459; 460; THUMBTWO-LABEL: load_atomic_f16__seq_cst: 461; THUMBTWO: @ %bb.0: 462; THUMBTWO-NEXT: ldrh r0, [r0] 463; THUMBTWO-NEXT: dmb ish 464; THUMBTWO-NEXT: bx lr 465; 466; THUMBONE-LABEL: load_atomic_f16__seq_cst: 467; THUMBONE: @ %bb.0: 468; THUMBONE-NEXT: push {r7, lr} 469; THUMBONE-NEXT: movs r1, #0 470; THUMBONE-NEXT: mov r2, r1 471; THUMBONE-NEXT: bl __sync_val_compare_and_swap_2 472; THUMBONE-NEXT: pop {r7, pc} 473; 474; ARMV4-LABEL: load_atomic_f16__seq_cst: 475; ARMV4: @ %bb.0: 476; ARMV4-NEXT: push {r11, lr} 477; ARMV4-NEXT: mov r1, #5 478; ARMV4-NEXT: bl __atomic_load_2 479; ARMV4-NEXT: pop {r11, lr} 480; ARMV4-NEXT: mov pc, lr 481; 482; ARMV6-LABEL: load_atomic_f16__seq_cst: 483; ARMV6: @ %bb.0: 484; ARMV6-NEXT: ldrh r0, [r0] 485; ARMV6-NEXT: mov r1, #0 486; ARMV6-NEXT: mcr p15, #0, r1, c7, c10, #5 487; ARMV6-NEXT: bx lr 488; 489; THUMBM-LABEL: load_atomic_f16__seq_cst: 490; THUMBM: @ %bb.0: 491; THUMBM-NEXT: ldrh r0, [r0] 492; THUMBM-NEXT: dmb sy 493; THUMBM-NEXT: bx lr 494 %val = load atomic half, ptr %ptr seq_cst, align 2 495 ret half %val 496} 497 498define bfloat @load_atomic_bf16__seq_cst(ptr %ptr) { 499; ARM-LABEL: load_atomic_bf16__seq_cst: 500; ARM: @ %bb.0: 501; ARM-NEXT: ldrh r0, [r0] 502; ARM-NEXT: dmb ish 503; ARM-NEXT: bx lr 504; 505; ARMOPTNONE-LABEL: load_atomic_bf16__seq_cst: 506; ARMOPTNONE: @ %bb.0: 507; ARMOPTNONE-NEXT: ldrh r0, [r0] 508; ARMOPTNONE-NEXT: dmb ish 509; ARMOPTNONE-NEXT: bx lr 510; 511; THUMBTWO-LABEL: load_atomic_bf16__seq_cst: 512; THUMBTWO: @ %bb.0: 513; THUMBTWO-NEXT: ldrh r0, [r0] 514; THUMBTWO-NEXT: dmb ish 515; THUMBTWO-NEXT: bx lr 516; 517; THUMBONE-LABEL: load_atomic_bf16__seq_cst: 518; THUMBONE: @ %bb.0: 519; THUMBONE-NEXT: push {r7, lr} 520; THUMBONE-NEXT: movs r1, #0 521; THUMBONE-NEXT: mov r2, r1 522; THUMBONE-NEXT: bl __sync_val_compare_and_swap_2 523; THUMBONE-NEXT: pop {r7, pc} 524; 525; ARMV4-LABEL: load_atomic_bf16__seq_cst: 526; ARMV4: @ %bb.0: 527; ARMV4-NEXT: push {r11, lr} 528; ARMV4-NEXT: mov r1, #5 529; ARMV4-NEXT: bl __atomic_load_2 530; ARMV4-NEXT: pop {r11, lr} 531; ARMV4-NEXT: mov pc, lr 532; 533; ARMV6-LABEL: load_atomic_bf16__seq_cst: 534; ARMV6: @ %bb.0: 535; ARMV6-NEXT: ldrh r0, [r0] 536; ARMV6-NEXT: mov r1, #0 537; ARMV6-NEXT: mcr p15, #0, r1, c7, c10, #5 538; ARMV6-NEXT: bx lr 539; 540; THUMBM-LABEL: load_atomic_bf16__seq_cst: 541; THUMBM: @ %bb.0: 542; THUMBM-NEXT: ldrh r0, [r0] 543; THUMBM-NEXT: dmb sy 544; THUMBM-NEXT: bx lr 545 %val = load atomic bfloat, ptr %ptr seq_cst, align 2 546 ret bfloat %val 547} 548 549define float @load_atomic_f32__seq_cst(ptr %ptr) { 550; ARM-LABEL: load_atomic_f32__seq_cst: 551; ARM: @ %bb.0: 552; ARM-NEXT: ldr r0, [r0] 553; ARM-NEXT: dmb ish 554; ARM-NEXT: bx lr 555; 556; ARMOPTNONE-LABEL: load_atomic_f32__seq_cst: 557; ARMOPTNONE: @ %bb.0: 558; ARMOPTNONE-NEXT: ldr r0, [r0] 559; ARMOPTNONE-NEXT: dmb ish 560; ARMOPTNONE-NEXT: vmov s0, r0 561; ARMOPTNONE-NEXT: bx lr 562; 563; THUMBTWO-LABEL: load_atomic_f32__seq_cst: 564; THUMBTWO: @ %bb.0: 565; THUMBTWO-NEXT: ldr r0, [r0] 566; THUMBTWO-NEXT: dmb ish 567; THUMBTWO-NEXT: bx lr 568; 569; THUMBONE-LABEL: load_atomic_f32__seq_cst: 570; THUMBONE: @ %bb.0: 571; THUMBONE-NEXT: push {r7, lr} 572; THUMBONE-NEXT: movs r1, #0 573; THUMBONE-NEXT: mov r2, r1 574; THUMBONE-NEXT: bl __sync_val_compare_and_swap_4 575; THUMBONE-NEXT: pop {r7, pc} 576; 577; ARMV4-LABEL: load_atomic_f32__seq_cst: 578; ARMV4: @ %bb.0: 579; ARMV4-NEXT: push {r11, lr} 580; ARMV4-NEXT: mov r1, #5 581; ARMV4-NEXT: bl __atomic_load_4 582; ARMV4-NEXT: pop {r11, lr} 583; ARMV4-NEXT: mov pc, lr 584; 585; ARMV6-LABEL: load_atomic_f32__seq_cst: 586; ARMV6: @ %bb.0: 587; ARMV6-NEXT: ldr r0, [r0] 588; ARMV6-NEXT: mov r1, #0 589; ARMV6-NEXT: mcr p15, #0, r1, c7, c10, #5 590; ARMV6-NEXT: bx lr 591; 592; THUMBM-LABEL: load_atomic_f32__seq_cst: 593; THUMBM: @ %bb.0: 594; THUMBM-NEXT: ldr r0, [r0] 595; THUMBM-NEXT: dmb sy 596; THUMBM-NEXT: bx lr 597 %val = load atomic float, ptr %ptr seq_cst, align 4 598 ret float %val 599} 600 601define double @load_atomic_f64__seq_cst(ptr %ptr) { 602; ARM-LABEL: load_atomic_f64__seq_cst: 603; ARM: @ %bb.0: 604; ARM-NEXT: ldrexd r0, r1, [r0] 605; ARM-NEXT: clrex 606; ARM-NEXT: dmb ish 607; ARM-NEXT: bx lr 608; 609; ARMOPTNONE-LABEL: load_atomic_f64__seq_cst: 610; ARMOPTNONE: @ %bb.0: 611; ARMOPTNONE-NEXT: ldrexd r2, r3, [r0] 612; ARMOPTNONE-NEXT: mov r1, r3 613; ARMOPTNONE-NEXT: mov r0, r2 614; ARMOPTNONE-NEXT: clrex 615; ARMOPTNONE-NEXT: dmb ish 616; ARMOPTNONE-NEXT: vmov d16, r0, r1 617; ARMOPTNONE-NEXT: bx lr 618; 619; THUMBTWO-LABEL: load_atomic_f64__seq_cst: 620; THUMBTWO: @ %bb.0: 621; THUMBTWO-NEXT: ldrexd r0, r1, [r0] 622; THUMBTWO-NEXT: clrex 623; THUMBTWO-NEXT: dmb ish 624; THUMBTWO-NEXT: bx lr 625; 626; THUMBONE-LABEL: load_atomic_f64__seq_cst: 627; THUMBONE: @ %bb.0: 628; THUMBONE-NEXT: push {r7, lr} 629; THUMBONE-NEXT: sub sp, #8 630; THUMBONE-NEXT: movs r2, #0 631; THUMBONE-NEXT: str r2, [sp] 632; THUMBONE-NEXT: str r2, [sp, #4] 633; THUMBONE-NEXT: mov r3, r2 634; THUMBONE-NEXT: bl __sync_val_compare_and_swap_8 635; THUMBONE-NEXT: add sp, #8 636; THUMBONE-NEXT: pop {r7, pc} 637; 638; ARMV4-LABEL: load_atomic_f64__seq_cst: 639; ARMV4: @ %bb.0: 640; ARMV4-NEXT: push {r11, lr} 641; ARMV4-NEXT: mov r1, #5 642; ARMV4-NEXT: bl __atomic_load_8 643; ARMV4-NEXT: pop {r11, lr} 644; ARMV4-NEXT: mov pc, lr 645; 646; ARMV6-LABEL: load_atomic_f64__seq_cst: 647; ARMV6: @ %bb.0: 648; ARMV6-NEXT: ldrexd r0, r1, [r0] 649; ARMV6-NEXT: mov r2, #0 650; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 651; ARMV6-NEXT: bx lr 652; 653; THUMBM-LABEL: load_atomic_f64__seq_cst: 654; THUMBM: @ %bb.0: 655; THUMBM-NEXT: push {r7, lr} 656; THUMBM-NEXT: movs r1, #5 657; THUMBM-NEXT: bl __atomic_load_8 658; THUMBM-NEXT: pop {r7, pc} 659 %val = load atomic double, ptr %ptr seq_cst, align 8 660 ret double %val 661} 662 663define void @store_atomic_f16__seq_cst(ptr %ptr, half %val1) { 664; ARM-LABEL: store_atomic_f16__seq_cst: 665; ARM: @ %bb.0: 666; ARM-NEXT: dmb ish 667; ARM-NEXT: strh r1, [r0] 668; ARM-NEXT: dmb ish 669; ARM-NEXT: bx lr 670; 671; ARMOPTNONE-LABEL: store_atomic_f16__seq_cst: 672; ARMOPTNONE: @ %bb.0: 673; ARMOPTNONE-NEXT: sub sp, sp, #4 674; ARMOPTNONE-NEXT: str r1, [sp] @ 4-byte Spill 675; ARMOPTNONE-NEXT: mov r1, r0 676; ARMOPTNONE-NEXT: ldr r0, [sp] @ 4-byte Reload 677; ARMOPTNONE-NEXT: vmov s0, r0 678; ARMOPTNONE-NEXT: vmov r0, s0 679; ARMOPTNONE-NEXT: dmb ish 680; ARMOPTNONE-NEXT: strh r0, [r1] 681; ARMOPTNONE-NEXT: dmb ish 682; ARMOPTNONE-NEXT: add sp, sp, #4 683; ARMOPTNONE-NEXT: bx lr 684; 685; THUMBTWO-LABEL: store_atomic_f16__seq_cst: 686; THUMBTWO: @ %bb.0: 687; THUMBTWO-NEXT: dmb ish 688; THUMBTWO-NEXT: strh r1, [r0] 689; THUMBTWO-NEXT: dmb ish 690; THUMBTWO-NEXT: bx lr 691; 692; THUMBONE-LABEL: store_atomic_f16__seq_cst: 693; THUMBONE: @ %bb.0: 694; THUMBONE-NEXT: push {r7, lr} 695; THUMBONE-NEXT: bl __sync_lock_test_and_set_2 696; THUMBONE-NEXT: pop {r7, pc} 697; 698; ARMV4-LABEL: store_atomic_f16__seq_cst: 699; ARMV4: @ %bb.0: 700; ARMV4-NEXT: push {r11, lr} 701; ARMV4-NEXT: mov r2, #5 702; ARMV4-NEXT: bl __atomic_store_2 703; ARMV4-NEXT: pop {r11, lr} 704; ARMV4-NEXT: mov pc, lr 705; 706; ARMV6-LABEL: store_atomic_f16__seq_cst: 707; ARMV6: @ %bb.0: 708; ARMV6-NEXT: mov r2, #0 709; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 710; ARMV6-NEXT: strh r1, [r0] 711; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 712; ARMV6-NEXT: bx lr 713; 714; THUMBM-LABEL: store_atomic_f16__seq_cst: 715; THUMBM: @ %bb.0: 716; THUMBM-NEXT: dmb sy 717; THUMBM-NEXT: strh r1, [r0] 718; THUMBM-NEXT: dmb sy 719; THUMBM-NEXT: bx lr 720 store atomic half %val1, ptr %ptr seq_cst, align 2 721 ret void 722} 723 724define void @store_atomic_bf16__seq_cst(ptr %ptr, bfloat %val1) { 725; ARM-LABEL: store_atomic_bf16__seq_cst: 726; ARM: @ %bb.0: 727; ARM-NEXT: dmb ish 728; ARM-NEXT: strh r1, [r0] 729; ARM-NEXT: dmb ish 730; ARM-NEXT: bx lr 731; 732; ARMOPTNONE-LABEL: store_atomic_bf16__seq_cst: 733; ARMOPTNONE: @ %bb.0: 734; ARMOPTNONE-NEXT: sub sp, sp, #4 735; ARMOPTNONE-NEXT: str r1, [sp] @ 4-byte Spill 736; ARMOPTNONE-NEXT: mov r1, r0 737; ARMOPTNONE-NEXT: ldr r0, [sp] @ 4-byte Reload 738; ARMOPTNONE-NEXT: vmov s0, r0 739; ARMOPTNONE-NEXT: vmov r0, s0 740; ARMOPTNONE-NEXT: dmb ish 741; ARMOPTNONE-NEXT: strh r0, [r1] 742; ARMOPTNONE-NEXT: dmb ish 743; ARMOPTNONE-NEXT: add sp, sp, #4 744; ARMOPTNONE-NEXT: bx lr 745; 746; THUMBTWO-LABEL: store_atomic_bf16__seq_cst: 747; THUMBTWO: @ %bb.0: 748; THUMBTWO-NEXT: dmb ish 749; THUMBTWO-NEXT: strh r1, [r0] 750; THUMBTWO-NEXT: dmb ish 751; THUMBTWO-NEXT: bx lr 752; 753; THUMBONE-LABEL: store_atomic_bf16__seq_cst: 754; THUMBONE: @ %bb.0: 755; THUMBONE-NEXT: push {r7, lr} 756; THUMBONE-NEXT: bl __sync_lock_test_and_set_2 757; THUMBONE-NEXT: pop {r7, pc} 758; 759; ARMV4-LABEL: store_atomic_bf16__seq_cst: 760; ARMV4: @ %bb.0: 761; ARMV4-NEXT: push {r11, lr} 762; ARMV4-NEXT: mov r2, #5 763; ARMV4-NEXT: bl __atomic_store_2 764; ARMV4-NEXT: pop {r11, lr} 765; ARMV4-NEXT: mov pc, lr 766; 767; ARMV6-LABEL: store_atomic_bf16__seq_cst: 768; ARMV6: @ %bb.0: 769; ARMV6-NEXT: mov r2, #0 770; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 771; ARMV6-NEXT: strh r1, [r0] 772; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 773; ARMV6-NEXT: bx lr 774; 775; THUMBM-LABEL: store_atomic_bf16__seq_cst: 776; THUMBM: @ %bb.0: 777; THUMBM-NEXT: dmb sy 778; THUMBM-NEXT: strh r1, [r0] 779; THUMBM-NEXT: dmb sy 780; THUMBM-NEXT: bx lr 781 store atomic bfloat %val1, ptr %ptr seq_cst, align 2 782 ret void 783} 784 785define void @store_atomic_f32__seq_cst(ptr %ptr, float %val1) { 786; ARM-LABEL: store_atomic_f32__seq_cst: 787; ARM: @ %bb.0: 788; ARM-NEXT: dmb ish 789; ARM-NEXT: str r1, [r0] 790; ARM-NEXT: dmb ish 791; ARM-NEXT: bx lr 792; 793; ARMOPTNONE-LABEL: store_atomic_f32__seq_cst: 794; ARMOPTNONE: @ %bb.0: 795; ARMOPTNONE-NEXT: sub sp, sp, #4 796; ARMOPTNONE-NEXT: str r1, [sp] @ 4-byte Spill 797; ARMOPTNONE-NEXT: mov r1, r0 798; ARMOPTNONE-NEXT: ldr r0, [sp] @ 4-byte Reload 799; ARMOPTNONE-NEXT: vmov s0, r0 800; ARMOPTNONE-NEXT: vmov r0, s0 801; ARMOPTNONE-NEXT: dmb ish 802; ARMOPTNONE-NEXT: str r0, [r1] 803; ARMOPTNONE-NEXT: dmb ish 804; ARMOPTNONE-NEXT: add sp, sp, #4 805; ARMOPTNONE-NEXT: bx lr 806; 807; THUMBTWO-LABEL: store_atomic_f32__seq_cst: 808; THUMBTWO: @ %bb.0: 809; THUMBTWO-NEXT: dmb ish 810; THUMBTWO-NEXT: str r1, [r0] 811; THUMBTWO-NEXT: dmb ish 812; THUMBTWO-NEXT: bx lr 813; 814; THUMBONE-LABEL: store_atomic_f32__seq_cst: 815; THUMBONE: @ %bb.0: 816; THUMBONE-NEXT: push {r7, lr} 817; THUMBONE-NEXT: bl __sync_lock_test_and_set_4 818; THUMBONE-NEXT: pop {r7, pc} 819; 820; ARMV4-LABEL: store_atomic_f32__seq_cst: 821; ARMV4: @ %bb.0: 822; ARMV4-NEXT: push {r11, lr} 823; ARMV4-NEXT: mov r2, #5 824; ARMV4-NEXT: bl __atomic_store_4 825; ARMV4-NEXT: pop {r11, lr} 826; ARMV4-NEXT: mov pc, lr 827; 828; ARMV6-LABEL: store_atomic_f32__seq_cst: 829; ARMV6: @ %bb.0: 830; ARMV6-NEXT: mov r2, #0 831; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 832; ARMV6-NEXT: str r1, [r0] 833; ARMV6-NEXT: mcr p15, #0, r2, c7, c10, #5 834; ARMV6-NEXT: bx lr 835; 836; THUMBM-LABEL: store_atomic_f32__seq_cst: 837; THUMBM: @ %bb.0: 838; THUMBM-NEXT: dmb sy 839; THUMBM-NEXT: str r1, [r0] 840; THUMBM-NEXT: dmb sy 841; THUMBM-NEXT: bx lr 842 store atomic float %val1, ptr %ptr seq_cst, align 4 843 ret void 844} 845 846define void @store_atomic_f64__seq_cst(ptr %ptr, double %val1) { 847; ARM-LABEL: store_atomic_f64__seq_cst: 848; ARM: @ %bb.0: 849; ARM-NEXT: push {r4, r5, lr} 850; ARM-NEXT: mov r3, r2 851; ARM-NEXT: dmb ish 852; ARM-NEXT: mov r2, r1 853; ARM-NEXT: LBB13_1: @ %atomicrmw.start 854; ARM-NEXT: @ =>This Inner Loop Header: Depth=1 855; ARM-NEXT: ldrexd r4, r5, [r0] 856; ARM-NEXT: strexd r1, r2, r3, [r0] 857; ARM-NEXT: cmp r1, #0 858; ARM-NEXT: bne LBB13_1 859; ARM-NEXT: @ %bb.2: @ %atomicrmw.end 860; ARM-NEXT: dmb ish 861; ARM-NEXT: pop {r4, r5, pc} 862; 863; ARMOPTNONE-LABEL: store_atomic_f64__seq_cst: 864; ARMOPTNONE: @ %bb.0: 865; ARMOPTNONE-NEXT: push {r4, r5, r7, r8, r10, r11, lr} 866; ARMOPTNONE-NEXT: add r7, sp, #20 867; ARMOPTNONE-NEXT: sub sp, sp, #24 868; ARMOPTNONE-NEXT: str r0, [sp, #4] @ 4-byte Spill 869; ARMOPTNONE-NEXT: vmov d16, r1, r2 870; ARMOPTNONE-NEXT: vmov r1, r2, d16 871; ARMOPTNONE-NEXT: str r2, [sp, #8] @ 4-byte Spill 872; ARMOPTNONE-NEXT: str r1, [sp, #12] @ 4-byte Spill 873; ARMOPTNONE-NEXT: dmb ish 874; ARMOPTNONE-NEXT: ldr r1, [r0] 875; ARMOPTNONE-NEXT: ldr r0, [r0, #4] 876; ARMOPTNONE-NEXT: str r1, [sp, #16] @ 4-byte Spill 877; ARMOPTNONE-NEXT: str r0, [sp, #20] @ 4-byte Spill 878; ARMOPTNONE-NEXT: b LBB13_1 879; ARMOPTNONE-NEXT: LBB13_1: @ %atomicrmw.start 880; ARMOPTNONE-NEXT: @ =>This Loop Header: Depth=1 881; ARMOPTNONE-NEXT: @ Child Loop BB13_2 Depth 2 882; ARMOPTNONE-NEXT: ldr r3, [sp, #20] @ 4-byte Reload 883; ARMOPTNONE-NEXT: ldr r2, [sp, #16] @ 4-byte Reload 884; ARMOPTNONE-NEXT: ldr r12, [sp, #8] @ 4-byte Reload 885; ARMOPTNONE-NEXT: ldr r0, [sp, #12] @ 4-byte Reload 886; ARMOPTNONE-NEXT: ldr r8, [sp, #4] @ 4-byte Reload 887; ARMOPTNONE-NEXT: str r3, [sp] @ 4-byte Spill 888; ARMOPTNONE-NEXT: @ implicit-def: $r1 889; ARMOPTNONE-NEXT: @ implicit-def: $r9 890; ARMOPTNONE-NEXT: @ kill: def $r8 killed $r8 def $r8_r9 891; ARMOPTNONE-NEXT: mov r9, r1 892; ARMOPTNONE-NEXT: @ kill: def $r0 killed $r0 def $r0_r1 893; ARMOPTNONE-NEXT: mov r1, r12 894; ARMOPTNONE-NEXT: mov r10, r2 895; ARMOPTNONE-NEXT: mov r11, r3 896; ARMOPTNONE-NEXT: LBB13_2: @ %atomicrmw.start 897; ARMOPTNONE-NEXT: @ Parent Loop BB13_1 Depth=1 898; ARMOPTNONE-NEXT: @ => This Inner Loop Header: Depth=2 899; ARMOPTNONE-NEXT: ldrexd r4, r5, [r8] 900; ARMOPTNONE-NEXT: cmp r4, r10 901; ARMOPTNONE-NEXT: cmpeq r5, r11 902; ARMOPTNONE-NEXT: bne LBB13_4 903; ARMOPTNONE-NEXT: @ %bb.3: @ %atomicrmw.start 904; ARMOPTNONE-NEXT: @ in Loop: Header=BB13_2 Depth=2 905; ARMOPTNONE-NEXT: strexd r9, r0, r1, [r8] 906; ARMOPTNONE-NEXT: cmp r9, #0 907; ARMOPTNONE-NEXT: bne LBB13_2 908; ARMOPTNONE-NEXT: LBB13_4: @ %atomicrmw.start 909; ARMOPTNONE-NEXT: @ in Loop: Header=BB13_1 Depth=1 910; ARMOPTNONE-NEXT: ldr r1, [sp] @ 4-byte Reload 911; ARMOPTNONE-NEXT: mov r0, r5 912; ARMOPTNONE-NEXT: eor r3, r0, r1 913; ARMOPTNONE-NEXT: mov r1, r4 914; ARMOPTNONE-NEXT: eor r2, r1, r2 915; ARMOPTNONE-NEXT: orr r2, r2, r3 916; ARMOPTNONE-NEXT: cmp r2, #0 917; ARMOPTNONE-NEXT: str r1, [sp, #16] @ 4-byte Spill 918; ARMOPTNONE-NEXT: str r0, [sp, #20] @ 4-byte Spill 919; ARMOPTNONE-NEXT: bne LBB13_1 920; ARMOPTNONE-NEXT: b LBB13_5 921; ARMOPTNONE-NEXT: LBB13_5: @ %atomicrmw.end 922; ARMOPTNONE-NEXT: dmb ish 923; ARMOPTNONE-NEXT: sub sp, r7, #20 924; ARMOPTNONE-NEXT: pop {r4, r5, r7, r8, r10, r11, pc} 925; 926; THUMBTWO-LABEL: store_atomic_f64__seq_cst: 927; THUMBTWO: @ %bb.0: 928; THUMBTWO-NEXT: dmb ish 929; THUMBTWO-NEXT: LBB13_1: @ %atomicrmw.start 930; THUMBTWO-NEXT: @ =>This Inner Loop Header: Depth=1 931; THUMBTWO-NEXT: ldrexd r3, r9, [r0] 932; THUMBTWO-NEXT: strexd r3, r1, r2, [r0] 933; THUMBTWO-NEXT: cmp r3, #0 934; THUMBTWO-NEXT: bne LBB13_1 935; THUMBTWO-NEXT: @ %bb.2: @ %atomicrmw.end 936; THUMBTWO-NEXT: dmb ish 937; THUMBTWO-NEXT: bx lr 938; 939; THUMBONE-LABEL: store_atomic_f64__seq_cst: 940; THUMBONE: @ %bb.0: 941; THUMBONE-NEXT: push {r7, lr} 942; THUMBONE-NEXT: bl __sync_lock_test_and_set_8 943; THUMBONE-NEXT: pop {r7, pc} 944; 945; ARMV4-LABEL: store_atomic_f64__seq_cst: 946; ARMV4: @ %bb.0: 947; ARMV4-NEXT: push {r11, lr} 948; ARMV4-NEXT: sub sp, sp, #8 949; ARMV4-NEXT: mov r1, #5 950; ARMV4-NEXT: str r1, [sp] 951; ARMV4-NEXT: bl __atomic_store_8 952; ARMV4-NEXT: add sp, sp, #8 953; ARMV4-NEXT: pop {r11, lr} 954; ARMV4-NEXT: mov pc, lr 955; 956; ARMV6-LABEL: store_atomic_f64__seq_cst: 957; ARMV6: @ %bb.0: 958; ARMV6-NEXT: push {r4, r5, r11, lr} 959; ARMV6-NEXT: @ kill: def $r3 killed $r3 killed $r2_r3 def $r2_r3 960; ARMV6-NEXT: mov r1, #0 961; ARMV6-NEXT: @ kill: def $r2 killed $r2 killed $r2_r3 def $r2_r3 962; ARMV6-NEXT: mcr p15, #0, r1, c7, c10, #5 963; ARMV6-NEXT: .LBB13_1: @ %atomicrmw.start 964; ARMV6-NEXT: @ =>This Inner Loop Header: Depth=1 965; ARMV6-NEXT: ldrexd r4, r5, [r0] 966; ARMV6-NEXT: strexd r1, r2, r3, [r0] 967; ARMV6-NEXT: cmp r1, #0 968; ARMV6-NEXT: bne .LBB13_1 969; ARMV6-NEXT: @ %bb.2: @ %atomicrmw.end 970; ARMV6-NEXT: mov r0, #0 971; ARMV6-NEXT: mcr p15, #0, r0, c7, c10, #5 972; ARMV6-NEXT: pop {r4, r5, r11, pc} 973; 974; THUMBM-LABEL: store_atomic_f64__seq_cst: 975; THUMBM: @ %bb.0: 976; THUMBM-NEXT: push {r7, lr} 977; THUMBM-NEXT: sub sp, #8 978; THUMBM-NEXT: movs r1, #5 979; THUMBM-NEXT: str r1, [sp] 980; THUMBM-NEXT: bl __atomic_store_8 981; THUMBM-NEXT: add sp, #8 982; THUMBM-NEXT: pop {r7, pc} 983 store atomic double %val1, ptr %ptr seq_cst, align 8 984 ret void 985} 986