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; In this file, we check that atomic load/store can make use of the indexed 7*9880d681SAndroid Build Coastguard Worker; versions of the instructions. 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; Indexed version of loads 10*9880d681SAndroid Build Coastguard Workerdefine i8 @load_x_i8_seq_cst([100000 x i8]* %mem) { 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_x_i8_seq_cst 12*9880d681SAndroid Build Coastguard Worker; CHECK: sync 13*9880d681SAndroid Build Coastguard Worker; CHECK: lbzx 14*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 15*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds [100000 x i8], [100000 x i8]* %mem, i64 0, i64 90000 16*9880d681SAndroid Build Coastguard Worker %val = load atomic i8, i8* %ptr seq_cst, align 1 17*9880d681SAndroid Build Coastguard Worker ret i8 %val 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Workerdefine i16 @load_x_i16_acquire([100000 x i16]* %mem) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_x_i16_acquire 21*9880d681SAndroid Build Coastguard Worker; CHECK: lhzx 22*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 23*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds [100000 x i16], [100000 x i16]* %mem, i64 0, i64 90000 24*9880d681SAndroid Build Coastguard Worker %val = load atomic i16, i16* %ptr acquire, align 2 25*9880d681SAndroid Build Coastguard Worker ret i16 %val 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Workerdefine i32 @load_x_i32_monotonic([100000 x i32]* %mem) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_x_i32_monotonic 29*9880d681SAndroid Build Coastguard Worker; CHECK: lwzx 30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 31*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds [100000 x i32], [100000 x i32]* %mem, i64 0, i64 90000 32*9880d681SAndroid Build Coastguard Worker %val = load atomic i32, i32* %ptr monotonic, align 4 33*9880d681SAndroid Build Coastguard Worker ret i32 %val 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Workerdefine i64 @load_x_i64_unordered([100000 x i64]* %mem) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_x_i64_unordered 37*9880d681SAndroid Build Coastguard Worker; PPC32: __sync_ 38*9880d681SAndroid Build Coastguard Worker; PPC64-NOT: __sync_ 39*9880d681SAndroid Build Coastguard Worker; PPC64: ldx 40*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 41*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds [100000 x i64], [100000 x i64]* %mem, i64 0, i64 90000 42*9880d681SAndroid Build Coastguard Worker %val = load atomic i64, i64* %ptr unordered, align 8 43*9880d681SAndroid Build Coastguard Worker ret i64 %val 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; Indexed version of stores 47*9880d681SAndroid Build Coastguard Workerdefine void @store_x_i8_seq_cst([100000 x i8]* %mem) { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_x_i8_seq_cst 49*9880d681SAndroid Build Coastguard Worker; CHECK: sync 50*9880d681SAndroid Build Coastguard Worker; CHECK: stbx 51*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds [100000 x i8], [100000 x i8]* %mem, i64 0, i64 90000 52*9880d681SAndroid Build Coastguard Worker store atomic i8 42, i8* %ptr seq_cst, align 1 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Workerdefine void @store_x_i16_release([100000 x i16]* %mem) { 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_x_i16_release 57*9880d681SAndroid Build Coastguard Worker; CHECK: lwsync 58*9880d681SAndroid Build Coastguard Worker; CHECK: sthx 59*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds [100000 x i16], [100000 x i16]* %mem, i64 0, i64 90000 60*9880d681SAndroid Build Coastguard Worker store atomic i16 42, i16* %ptr release, align 2 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Workerdefine void @store_x_i32_monotonic([100000 x i32]* %mem) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_x_i32_monotonic 65*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 66*9880d681SAndroid Build Coastguard Worker; CHECK: stwx 67*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds [100000 x i32], [100000 x i32]* %mem, i64 0, i64 90000 68*9880d681SAndroid Build Coastguard Worker store atomic i32 42, i32* %ptr monotonic, align 4 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Workerdefine void @store_x_i64_unordered([100000 x i64]* %mem) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_x_i64_unordered 73*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sync 74*9880d681SAndroid Build Coastguard Worker; PPC32: __sync_ 75*9880d681SAndroid Build Coastguard Worker; PPC64-NOT: __sync_ 76*9880d681SAndroid Build Coastguard Worker; PPC64: stdx 77*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds [100000 x i64], [100000 x i64]* %mem, i64 0, i64 90000 78*9880d681SAndroid Build Coastguard Worker store atomic i64 42, i64* %ptr unordered, align 8 79*9880d681SAndroid Build Coastguard Worker ret void 80*9880d681SAndroid Build Coastguard Worker} 81