1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom0 5*9880d681SAndroid Build Coastguard Workerdefine i32 @atom0(i32* %addr, i32 %val) { 6*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.u32 7*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw add i32* %addr, i32 %val seq_cst 8*9880d681SAndroid Build Coastguard Worker ret i32 %ret 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom1 12*9880d681SAndroid Build Coastguard Workerdefine i64 @atom1(i64* %addr, i64 %val) { 13*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.u64 14*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw add i64* %addr, i64 %val seq_cst 15*9880d681SAndroid Build Coastguard Worker ret i64 %ret 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom2 19*9880d681SAndroid Build Coastguard Workerdefine i32 @atom2(i32* %subr, i32 %val) { 20*9880d681SAndroid Build Coastguard Worker; CHECK: neg.s32 21*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.u32 22*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw sub i32* %subr, i32 %val seq_cst 23*9880d681SAndroid Build Coastguard Worker ret i32 %ret 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom3 27*9880d681SAndroid Build Coastguard Workerdefine i64 @atom3(i64* %subr, i64 %val) { 28*9880d681SAndroid Build Coastguard Worker; CHECK: neg.s64 29*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.u64 30*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw sub i64* %subr, i64 %val seq_cst 31*9880d681SAndroid Build Coastguard Worker ret i64 %ret 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom4 35*9880d681SAndroid Build Coastguard Workerdefine i32 @atom4(i32* %subr, i32 %val) { 36*9880d681SAndroid Build Coastguard Worker; CHECK: atom.and.b32 37*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw and i32* %subr, i32 %val seq_cst 38*9880d681SAndroid Build Coastguard Worker ret i32 %ret 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom5 42*9880d681SAndroid Build Coastguard Workerdefine i64 @atom5(i64* %subr, i64 %val) { 43*9880d681SAndroid Build Coastguard Worker; CHECK: atom.and.b64 44*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw and i64* %subr, i64 %val seq_cst 45*9880d681SAndroid Build Coastguard Worker ret i64 %ret 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker;; NAND not yet supported 49*9880d681SAndroid Build Coastguard Worker;define i32 @atom6(i32* %subr, i32 %val) { 50*9880d681SAndroid Build Coastguard Worker; %ret = atomicrmw nand i32* %subr, i32 %val seq_cst 51*9880d681SAndroid Build Coastguard Worker; ret i32 %ret 52*9880d681SAndroid Build Coastguard Worker;} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker;define i64 @atom7(i64* %subr, i64 %val) { 55*9880d681SAndroid Build Coastguard Worker; %ret = atomicrmw nand i64* %subr, i64 %val seq_cst 56*9880d681SAndroid Build Coastguard Worker; ret i64 %ret 57*9880d681SAndroid Build Coastguard Worker;} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom8 60*9880d681SAndroid Build Coastguard Workerdefine i32 @atom8(i32* %subr, i32 %val) { 61*9880d681SAndroid Build Coastguard Worker; CHECK: atom.or.b32 62*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw or i32* %subr, i32 %val seq_cst 63*9880d681SAndroid Build Coastguard Worker ret i32 %ret 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom9 67*9880d681SAndroid Build Coastguard Workerdefine i64 @atom9(i64* %subr, i64 %val) { 68*9880d681SAndroid Build Coastguard Worker; CHECK: atom.or.b64 69*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw or i64* %subr, i64 %val seq_cst 70*9880d681SAndroid Build Coastguard Worker ret i64 %ret 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom10 74*9880d681SAndroid Build Coastguard Workerdefine i32 @atom10(i32* %subr, i32 %val) { 75*9880d681SAndroid Build Coastguard Worker; CHECK: atom.xor.b32 76*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw xor i32* %subr, i32 %val seq_cst 77*9880d681SAndroid Build Coastguard Worker ret i32 %ret 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom11 81*9880d681SAndroid Build Coastguard Workerdefine i64 @atom11(i64* %subr, i64 %val) { 82*9880d681SAndroid Build Coastguard Worker; CHECK: atom.xor.b64 83*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw xor i64* %subr, i64 %val seq_cst 84*9880d681SAndroid Build Coastguard Worker ret i64 %ret 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom12 88*9880d681SAndroid Build Coastguard Workerdefine i32 @atom12(i32* %subr, i32 %val) { 89*9880d681SAndroid Build Coastguard Worker; CHECK: atom.max.s32 90*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw max i32* %subr, i32 %val seq_cst 91*9880d681SAndroid Build Coastguard Worker ret i32 %ret 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom13 95*9880d681SAndroid Build Coastguard Workerdefine i64 @atom13(i64* %subr, i64 %val) { 96*9880d681SAndroid Build Coastguard Worker; CHECK: atom.max.s64 97*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw max i64* %subr, i64 %val seq_cst 98*9880d681SAndroid Build Coastguard Worker ret i64 %ret 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom14 102*9880d681SAndroid Build Coastguard Workerdefine i32 @atom14(i32* %subr, i32 %val) { 103*9880d681SAndroid Build Coastguard Worker; CHECK: atom.min.s32 104*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw min i32* %subr, i32 %val seq_cst 105*9880d681SAndroid Build Coastguard Worker ret i32 %ret 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom15 109*9880d681SAndroid Build Coastguard Workerdefine i64 @atom15(i64* %subr, i64 %val) { 110*9880d681SAndroid Build Coastguard Worker; CHECK: atom.min.s64 111*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw min i64* %subr, i64 %val seq_cst 112*9880d681SAndroid Build Coastguard Worker ret i64 %ret 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom16 116*9880d681SAndroid Build Coastguard Workerdefine i32 @atom16(i32* %subr, i32 %val) { 117*9880d681SAndroid Build Coastguard Worker; CHECK: atom.max.u32 118*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw umax i32* %subr, i32 %val seq_cst 119*9880d681SAndroid Build Coastguard Worker ret i32 %ret 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom17 123*9880d681SAndroid Build Coastguard Workerdefine i64 @atom17(i64* %subr, i64 %val) { 124*9880d681SAndroid Build Coastguard Worker; CHECK: atom.max.u64 125*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw umax i64* %subr, i64 %val seq_cst 126*9880d681SAndroid Build Coastguard Worker ret i64 %ret 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom18 130*9880d681SAndroid Build Coastguard Workerdefine i32 @atom18(i32* %subr, i32 %val) { 131*9880d681SAndroid Build Coastguard Worker; CHECK: atom.min.u32 132*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw umin i32* %subr, i32 %val seq_cst 133*9880d681SAndroid Build Coastguard Worker ret i32 %ret 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atom19 137*9880d681SAndroid Build Coastguard Workerdefine i64 @atom19(i64* %subr, i64 %val) { 138*9880d681SAndroid Build Coastguard Worker; CHECK: atom.min.u64 139*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw umin i64* %subr, i64 %val seq_cst 140*9880d681SAndroid Build Coastguard Worker ret i64 %ret 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val) 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_add_f32_generic 146*9880d681SAndroid Build Coastguard Workerdefine float @atomic_add_f32_generic(float* %addr, float %val) { 147*9880d681SAndroid Build Coastguard Worker; CHECK: atom.add.f32 148*9880d681SAndroid Build Coastguard Worker %ret = call float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val) 149*9880d681SAndroid Build Coastguard Worker ret float %ret 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val) 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_add_f32_addrspace1 155*9880d681SAndroid Build Coastguard Workerdefine float @atomic_add_f32_addrspace1(float addrspace(1)* %addr, float %val) { 156*9880d681SAndroid Build Coastguard Worker; CHECK: atom.global.add.f32 157*9880d681SAndroid Build Coastguard Worker %ret = call float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val) 158*9880d681SAndroid Build Coastguard Worker ret float %ret 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val) 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_add_f32_addrspace3 164*9880d681SAndroid Build Coastguard Workerdefine float @atomic_add_f32_addrspace3(float addrspace(3)* %addr, float %val) { 165*9880d681SAndroid Build Coastguard Worker; CHECK: atom.shared.add.f32 166*9880d681SAndroid Build Coastguard Worker %ret = call float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val) 167*9880d681SAndroid Build Coastguard Worker ret float %ret 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_cmpxchg_i32 171*9880d681SAndroid Build Coastguard Workerdefine i32 @atomic_cmpxchg_i32(i32* %addr, i32 %cmp, i32 %new) { 172*9880d681SAndroid Build Coastguard Worker; CHECK: atom.cas.b32 173*9880d681SAndroid Build Coastguard Worker %pairold = cmpxchg i32* %addr, i32 %cmp, i32 %new seq_cst seq_cst 174*9880d681SAndroid Build Coastguard Worker ret i32 %new 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_cmpxchg_i64 178*9880d681SAndroid Build Coastguard Workerdefine i64 @atomic_cmpxchg_i64(i64* %addr, i64 %cmp, i64 %new) { 179*9880d681SAndroid Build Coastguard Worker; CHECK: atom.cas.b64 180*9880d681SAndroid Build Coastguard Worker %pairold = cmpxchg i64* %addr, i64 %cmp, i64 %new seq_cst seq_cst 181*9880d681SAndroid Build Coastguard Worker ret i64 %new 182*9880d681SAndroid Build Coastguard Worker} 183