1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=powerpc-apple-darwin -march=ppc32 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK --check-prefix=PPC32 2*9880d681SAndroid Build Coastguard Worker; FIXME: -verify-machineinstrs currently fail on ppc64 (mismatched register/instruction). 3*9880d681SAndroid Build Coastguard Worker; This is already checked for in Atomics-64.ll 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=powerpc-apple-darwin -march=ppc64 | FileCheck %s --check-prefix=CHECK --check-prefix=PPC64 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; FIXME: we don't currently check for the operations themselves with CHECK-NEXT, 7*9880d681SAndroid Build Coastguard Worker; because they are implemented in a very messy way with lwarx/stwcx. 8*9880d681SAndroid Build Coastguard Worker; It should be fixed soon in another patch. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; We first check loads, for all sizes from i8 to i64. 11*9880d681SAndroid Build Coastguard Worker; We also vary orderings to check for barriers. 12*9880d681SAndroid Build Coastguard Workerdefine i8 @load_i8_unordered(i8* %mem) { 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_i8_unordered 14*9880d681SAndroid Build Coastguard Worker; CHECK: lbz 15*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 16*9880d681SAndroid Build Coastguard Worker %val = load atomic i8, i8* %mem unordered, align 1 17*9880d681SAndroid Build Coastguard Worker ret i8 %val 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Workerdefine i16 @load_i16_monotonic(i16* %mem) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_i16_monotonic 21*9880d681SAndroid Build Coastguard Worker; CHECK: lhz 22*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 23*9880d681SAndroid Build Coastguard Worker %val = load atomic i16, i16* %mem monotonic, align 2 24*9880d681SAndroid Build Coastguard Worker ret i16 %val 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Workerdefine i32 @load_i32_acquire(i32* %mem) { 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_i32_acquire 28*9880d681SAndroid Build Coastguard Worker; CHECK: lwz 29*9880d681SAndroid Build Coastguard Worker %val = load atomic i32, i32* %mem acquire, align 4 30*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 31*9880d681SAndroid Build Coastguard Worker ret i32 %val 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Workerdefine i64 @load_i64_seq_cst(i64* %mem) { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_i64_seq_cst 35*9880d681SAndroid Build Coastguard Worker; CHECK: sync 36*9880d681SAndroid Build Coastguard Worker; PPC32: __sync_ 37*9880d681SAndroid Build Coastguard Worker; PPC64-NOT: __sync_ 38*9880d681SAndroid Build Coastguard Worker; PPC64: ld 39*9880d681SAndroid Build Coastguard Worker %val = load atomic i64, i64* %mem seq_cst, align 8 40*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 41*9880d681SAndroid Build Coastguard Worker ret i64 %val 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Stores 45*9880d681SAndroid Build Coastguard Workerdefine void @store_i8_unordered(i8* %mem) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_i8_unordered 47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 48*9880d681SAndroid Build Coastguard Worker; CHECK: stb 49*9880d681SAndroid Build Coastguard Worker store atomic i8 42, i8* %mem unordered, align 1 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Workerdefine void @store_i16_monotonic(i16* %mem) { 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_i16_monotonic 54*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 55*9880d681SAndroid Build Coastguard Worker; CHECK: sth 56*9880d681SAndroid Build Coastguard Worker store atomic i16 42, i16* %mem monotonic, align 2 57*9880d681SAndroid Build Coastguard Worker ret void 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Workerdefine void @store_i32_release(i32* %mem) { 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_i32_release 61*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 62*9880d681SAndroid Build Coastguard Worker; CHECK: stw 63*9880d681SAndroid Build Coastguard Worker store atomic i32 42, i32* %mem release, align 4 64*9880d681SAndroid Build Coastguard Worker ret void 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Workerdefine void @store_i64_seq_cst(i64* %mem) { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_i64_seq_cst 68*9880d681SAndroid Build Coastguard Worker; CHECK: sync 69*9880d681SAndroid Build Coastguard Worker; PPC32: __sync_ 70*9880d681SAndroid Build Coastguard Worker; PPC64-NOT: __sync_ 71*9880d681SAndroid Build Coastguard Worker; PPC64: std 72*9880d681SAndroid Build Coastguard Worker store atomic i64 42, i64* %mem seq_cst, align 8 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; Atomic CmpXchg 77*9880d681SAndroid Build Coastguard Workerdefine i8 @cas_strong_i8_sc_sc(i8* %mem) { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cas_strong_i8_sc_sc 79*9880d681SAndroid Build Coastguard Worker; CHECK: sync 80*9880d681SAndroid Build Coastguard Worker %val = cmpxchg i8* %mem, i8 0, i8 1 seq_cst seq_cst 81*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 82*9880d681SAndroid Build Coastguard Worker %loaded = extractvalue { i8, i1} %val, 0 83*9880d681SAndroid Build Coastguard Worker ret i8 %loaded 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Workerdefine i16 @cas_weak_i16_acquire_acquire(i16* %mem) { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cas_weak_i16_acquire_acquire 87*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: sync 88*9880d681SAndroid Build Coastguard Worker %val = cmpxchg weak i16* %mem, i16 0, i16 1 acquire acquire 89*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 90*9880d681SAndroid Build Coastguard Worker %loaded = extractvalue { i16, i1} %val, 0 91*9880d681SAndroid Build Coastguard Worker ret i16 %loaded 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Workerdefine i32 @cas_strong_i32_acqrel_acquire(i32* %mem) { 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cas_strong_i32_acqrel_acquire 95*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 96*9880d681SAndroid Build Coastguard Worker %val = cmpxchg i32* %mem, i32 0, i32 1 acq_rel acquire 97*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 98*9880d681SAndroid Build Coastguard Worker %loaded = extractvalue { i32, i1} %val, 0 99*9880d681SAndroid Build Coastguard Worker ret i32 %loaded 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Workerdefine i64 @cas_weak_i64_release_monotonic(i64* %mem) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cas_weak_i64_release_monotonic 103*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 104*9880d681SAndroid Build Coastguard Worker %val = cmpxchg weak i64* %mem, i64 0, i64 1 release monotonic 105*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: [sync ] 106*9880d681SAndroid Build Coastguard Worker %loaded = extractvalue { i64, i1} %val, 0 107*9880d681SAndroid Build Coastguard Worker ret i64 %loaded 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; AtomicRMW 111*9880d681SAndroid Build Coastguard Workerdefine i8 @add_i8_monotonic(i8* %mem, i8 %operand) { 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add_i8_monotonic 113*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 114*9880d681SAndroid Build Coastguard Worker %val = atomicrmw add i8* %mem, i8 %operand monotonic 115*9880d681SAndroid Build Coastguard Worker ret i8 %val 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Workerdefine i16 @xor_i16_seq_cst(i16* %mem, i16 %operand) { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_i16_seq_cst 119*9880d681SAndroid Build Coastguard Worker; CHECK: sync 120*9880d681SAndroid Build Coastguard Worker %val = atomicrmw xor i16* %mem, i16 %operand seq_cst 121*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 122*9880d681SAndroid Build Coastguard Worker ret i16 %val 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Workerdefine i32 @xchg_i32_acq_rel(i32* %mem, i32 %operand) { 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xchg_i32_acq_rel 126*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 127*9880d681SAndroid Build Coastguard Worker %val = atomicrmw xchg i32* %mem, i32 %operand acq_rel 128*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 129*9880d681SAndroid Build Coastguard Worker ret i32 %val 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Workerdefine i64 @and_i64_release(i64* %mem, i64 %operand) { 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_i64_release 133*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 134*9880d681SAndroid Build Coastguard Worker %val = atomicrmw and i64* %mem, i64 %operand release 135*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: [sync ] 136*9880d681SAndroid Build Coastguard Worker ret i64 %val 137*9880d681SAndroid Build Coastguard Worker} 138