1; RUN: llc < %s -march=ppc64 | FileCheck %s 2 3define i64 @exchange_and_add(i64* %mem, i64 %val) nounwind { 4; CHECK-LABEL: exchange_and_add: 5; CHECK: ldarx 6 %tmp = atomicrmw add i64* %mem, i64 %val monotonic 7; CHECK: stdcx. 8 ret i64 %tmp 9} 10 11define i64 @exchange_and_cmp(i64* %mem) nounwind { 12; CHECK-LABEL: exchange_and_cmp: 13; CHECK: ldarx 14 %tmppair = cmpxchg i64* %mem, i64 0, i64 1 monotonic monotonic 15 %tmp = extractvalue { i64, i1 } %tmppair, 0 16; CHECK: stdcx. 17; CHECK: stdcx. 18 ret i64 %tmp 19} 20 21define i64 @exchange(i64* %mem, i64 %val) nounwind { 22; CHECK-LABEL: exchange: 23; CHECK: ldarx 24 %tmp = atomicrmw xchg i64* %mem, i64 1 monotonic 25; CHECK: stdcx. 26 ret i64 %tmp 27} 28 29define void @atomic_store(i64* %mem, i64 %val) nounwind { 30entry: 31; CHECK: @atomic_store 32 store atomic i64 %val, i64* %mem release, align 64 33; CHECK: sync 1 34; CHECK-NOT: stdcx 35; CHECK: std 36 ret void 37} 38 39define i64 @atomic_load(i64* %mem) nounwind { 40entry: 41; CHECK: @atomic_load 42 %tmp = load atomic i64* %mem acquire, align 64 43; CHECK-NOT: ldarx 44; CHECK: ld 45; CHECK: sync 1 46 ret i64 %tmp 47} 48 49