1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -asm-verbose=false -verify-machineinstrs -mcpu=cyclone | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @val_compare_and_swap(i32* %p, i32 %cmp, i32 %new) #0 { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: val_compare_and_swap: 5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov x[[ADDR:[0-9]+]], x0 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRYBB:.?LBB[0-9_]+]]: 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldaxr [[RESULT:w[0-9]+]], [x[[ADDR]]] 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp [[RESULT]], w1 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.ne [[FAILBB:.?LBB[0-9_]+]] 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stxr [[SCRATCH_REG:w[0-9]+]], w2, [x[[ADDR]]] 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbnz [[SCRATCH_REG]], [[TRYBB]] 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b [[EXITBB:.?LBB[0-9_]+]] 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[FAILBB]]: 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: clrex 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[EXITBB]]: 16*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acquire acquire 17*9880d681SAndroid Build Coastguard Worker %val = extractvalue { i32, i1 } %pair, 0 18*9880d681SAndroid Build Coastguard Worker ret i32 %val 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i32 @val_compare_and_swap_from_load(i32* %p, i32 %cmp, i32* %pnew) #0 { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: val_compare_and_swap_from_load: 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[NEW:w[0-9]+]], [x2] 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRYBB:.?LBB[0-9_]+]]: 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldaxr [[RESULT:w[0-9]+]], [x0] 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp [[RESULT]], w1 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.ne [[FAILBB:.?LBB[0-9_]+]] 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stxr [[SCRATCH_REG:w[0-9]+]], [[NEW]], [x0] 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbnz [[SCRATCH_REG]], [[TRYBB]] 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b [[EXITBB:.?LBB[0-9_]+]] 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[FAILBB]]: 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: clrex 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[EXITBB]]: 34*9880d681SAndroid Build Coastguard Worker %new = load i32, i32* %pnew 35*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acquire acquire 36*9880d681SAndroid Build Coastguard Worker %val = extractvalue { i32, i1 } %pair, 0 37*9880d681SAndroid Build Coastguard Worker ret i32 %val 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine i32 @val_compare_and_swap_rel(i32* %p, i32 %cmp, i32 %new) #0 { 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: val_compare_and_swap_rel: 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov x[[ADDR:[0-9]+]], x0 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRYBB:.?LBB[0-9_]+]]: 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldaxr [[RESULT:w[0-9]+]], [x[[ADDR]] 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp [[RESULT]], w1 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.ne [[FAILBB:.?LBB[0-9_]+]] 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stlxr [[SCRATCH_REG:w[0-9]+]], w2, [x[[ADDR]] 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbnz [[SCRATCH_REG]], [[TRYBB]] 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b [[EXITBB:.?LBB[0-9_]+]] 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[FAILBB]]: 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: clrex 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[EXITBB]]: 53*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acq_rel monotonic 54*9880d681SAndroid Build Coastguard Worker %val = extractvalue { i32, i1 } %pair, 0 55*9880d681SAndroid Build Coastguard Worker ret i32 %val 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine i64 @val_compare_and_swap_64(i64* %p, i64 %cmp, i64 %new) #0 { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: val_compare_and_swap_64: 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov x[[ADDR:[0-9]+]], x0 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRYBB:.?LBB[0-9_]+]]: 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldxr [[RESULT:x[0-9]+]], [x[[ADDR]]] 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp [[RESULT]], x1 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.ne [[FAILBB:.?LBB[0-9_]+]] 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stxr [[SCRATCH_REG:w[0-9]+]], x2, [x[[ADDR]]] 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbnz [[SCRATCH_REG]], [[TRYBB]] 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b [[EXITBB:.?LBB[0-9_]+]] 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[FAILBB]]: 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: clrex 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[EXITBB]]: 71*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i64* %p, i64 %cmp, i64 %new monotonic monotonic 72*9880d681SAndroid Build Coastguard Worker %val = extractvalue { i64, i1 } %pair, 0 73*9880d681SAndroid Build Coastguard Worker ret i64 %val 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine i32 @fetch_and_nand(i32* %p) #0 { 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fetch_and_nand: 78*9880d681SAndroid Build Coastguard Worker; CHECK: [[TRYBB:.?LBB[0-9_]+]]: 79*9880d681SAndroid Build Coastguard Worker; CHECK: ldxr w[[DEST_REG:[0-9]+]], [x0] 80*9880d681SAndroid Build Coastguard Worker; CHECK: mvn [[TMP_REG:w[0-9]+]], w[[DEST_REG]] 81*9880d681SAndroid Build Coastguard Worker; CHECK: orr [[SCRATCH2_REG:w[0-9]+]], [[TMP_REG]], #0xfffffff8 82*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: stlxr [[SCRATCH2_REG]], [[SCRATCH2_REG]] 83*9880d681SAndroid Build Coastguard Worker; CHECK: stlxr [[SCRATCH_REG:w[0-9]+]], [[SCRATCH2_REG]], [x0] 84*9880d681SAndroid Build Coastguard Worker; CHECK: cbnz [[SCRATCH_REG]], [[TRYBB]] 85*9880d681SAndroid Build Coastguard Worker; CHECK: mov x0, x[[DEST_REG]] 86*9880d681SAndroid Build Coastguard Worker %val = atomicrmw nand i32* %p, i32 7 release 87*9880d681SAndroid Build Coastguard Worker ret i32 %val 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine i64 @fetch_and_nand_64(i64* %p) #0 { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fetch_and_nand_64: 92*9880d681SAndroid Build Coastguard Worker; CHECK: mov x[[ADDR:[0-9]+]], x0 93*9880d681SAndroid Build Coastguard Worker; CHECK: [[TRYBB:.?LBB[0-9_]+]]: 94*9880d681SAndroid Build Coastguard Worker; CHECK: ldaxr x[[DEST_REG:[0-9]+]], [x[[ADDR]]] 95*9880d681SAndroid Build Coastguard Worker; CHECK: mvn w[[TMP_REG:[0-9]+]], w[[DEST_REG]] 96*9880d681SAndroid Build Coastguard Worker; CHECK: orr [[SCRATCH2_REG:x[0-9]+]], x[[TMP_REG]], #0xfffffffffffffff8 97*9880d681SAndroid Build Coastguard Worker; CHECK: stlxr [[SCRATCH_REG:w[0-9]+]], [[SCRATCH2_REG]], [x[[ADDR]]] 98*9880d681SAndroid Build Coastguard Worker; CHECK: cbnz [[SCRATCH_REG]], [[TRYBB]] 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker %val = atomicrmw nand i64* %p, i64 7 acq_rel 101*9880d681SAndroid Build Coastguard Worker ret i64 %val 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine i32 @fetch_and_or(i32* %p) #0 { 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fetch_and_or: 106*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OLDVAL_REG:w[0-9]+]], #5 107*9880d681SAndroid Build Coastguard Worker; CHECK: [[TRYBB:.?LBB[0-9_]+]]: 108*9880d681SAndroid Build Coastguard Worker; CHECK: ldaxr w[[DEST_REG:[0-9]+]], [x0] 109*9880d681SAndroid Build Coastguard Worker; CHECK: orr [[SCRATCH2_REG:w[0-9]+]], w[[DEST_REG]], [[OLDVAL_REG]] 110*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: stlxr [[SCRATCH2_REG]], [[SCRATCH2_REG]] 111*9880d681SAndroid Build Coastguard Worker; CHECK: stlxr [[SCRATCH_REG:w[0-9]+]], [[SCRATCH2_REG]], [x0] 112*9880d681SAndroid Build Coastguard Worker; CHECK: cbnz [[SCRATCH_REG]], [[TRYBB]] 113*9880d681SAndroid Build Coastguard Worker; CHECK: mov x0, x[[DEST_REG]] 114*9880d681SAndroid Build Coastguard Worker %val = atomicrmw or i32* %p, i32 5 seq_cst 115*9880d681SAndroid Build Coastguard Worker ret i32 %val 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine i64 @fetch_and_or_64(i64* %p) #0 { 119*9880d681SAndroid Build Coastguard Worker; CHECK: fetch_and_or_64: 120*9880d681SAndroid Build Coastguard Worker; CHECK: mov x[[ADDR:[0-9]+]], x0 121*9880d681SAndroid Build Coastguard Worker; CHECK: [[TRYBB:.?LBB[0-9_]+]]: 122*9880d681SAndroid Build Coastguard Worker; CHECK: ldxr [[DEST_REG:x[0-9]+]], [x[[ADDR]]] 123*9880d681SAndroid Build Coastguard Worker; CHECK: orr [[SCRATCH2_REG:x[0-9]+]], [[DEST_REG]], #0x7 124*9880d681SAndroid Build Coastguard Worker; CHECK: stxr [[SCRATCH_REG:w[0-9]+]], [[SCRATCH2_REG]], [x[[ADDR]]] 125*9880d681SAndroid Build Coastguard Worker; CHECK: cbnz [[SCRATCH_REG]], [[TRYBB]] 126*9880d681SAndroid Build Coastguard Worker %val = atomicrmw or i64* %p, i64 7 monotonic 127*9880d681SAndroid Build Coastguard Worker ret i64 %val 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdefine void @acquire_fence() #0 { 131*9880d681SAndroid Build Coastguard Worker fence acquire 132*9880d681SAndroid Build Coastguard Worker ret void 133*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: acquire_fence: 134*9880d681SAndroid Build Coastguard Worker ; CHECK: dmb ishld 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerdefine void @release_fence() #0 { 138*9880d681SAndroid Build Coastguard Worker fence release 139*9880d681SAndroid Build Coastguard Worker ret void 140*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: release_fence: 141*9880d681SAndroid Build Coastguard Worker ; CHECK: dmb ish{{$}} 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine void @seq_cst_fence() #0 { 145*9880d681SAndroid Build Coastguard Worker fence seq_cst 146*9880d681SAndroid Build Coastguard Worker ret void 147*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: seq_cst_fence: 148*9880d681SAndroid Build Coastguard Worker ; CHECK: dmb ish{{$}} 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i32 @atomic_load(i32* %p) #0 { 152*9880d681SAndroid Build Coastguard Worker %r = load atomic i32, i32* %p seq_cst, align 4 153*9880d681SAndroid Build Coastguard Worker ret i32 %r 154*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: atomic_load: 155*9880d681SAndroid Build Coastguard Worker ; CHECK: ldar 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdefine i8 @atomic_load_relaxed_8(i8* %p, i32 %off32) #0 { 159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_load_relaxed_8: 160*9880d681SAndroid Build Coastguard Worker %ptr_unsigned = getelementptr i8, i8* %p, i32 4095 161*9880d681SAndroid Build Coastguard Worker %val_unsigned = load atomic i8, i8* %ptr_unsigned monotonic, align 1 162*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb {{w[0-9]+}}, [x0, #4095] 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker %ptr_regoff = getelementptr i8, i8* %p, i32 %off32 165*9880d681SAndroid Build Coastguard Worker %val_regoff = load atomic i8, i8* %ptr_regoff unordered, align 1 166*9880d681SAndroid Build Coastguard Worker %tot1 = add i8 %val_unsigned, %val_regoff 167*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb {{w[0-9]+}}, [x0, w1, sxtw] 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker %ptr_unscaled = getelementptr i8, i8* %p, i32 -256 170*9880d681SAndroid Build Coastguard Worker %val_unscaled = load atomic i8, i8* %ptr_unscaled monotonic, align 1 171*9880d681SAndroid Build Coastguard Worker %tot2 = add i8 %tot1, %val_unscaled 172*9880d681SAndroid Build Coastguard Worker; CHECK: ldurb {{w[0-9]+}}, [x0, #-256] 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker %ptr_random = getelementptr i8, i8* %p, i32 1191936 ; 0x123000 (i.e. ADD imm) 175*9880d681SAndroid Build Coastguard Worker %val_random = load atomic i8, i8* %ptr_random unordered, align 1 176*9880d681SAndroid Build Coastguard Worker %tot3 = add i8 %tot2, %val_random 177*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], x0, #291, lsl #12 178*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb {{w[0-9]+}}, [x[[ADDR]]] 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker ret i8 %tot3 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerdefine i16 @atomic_load_relaxed_16(i16* %p, i32 %off32) #0 { 184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_load_relaxed_16: 185*9880d681SAndroid Build Coastguard Worker %ptr_unsigned = getelementptr i16, i16* %p, i32 4095 186*9880d681SAndroid Build Coastguard Worker %val_unsigned = load atomic i16, i16* %ptr_unsigned monotonic, align 2 187*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh {{w[0-9]+}}, [x0, #8190] 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker %ptr_regoff = getelementptr i16, i16* %p, i32 %off32 190*9880d681SAndroid Build Coastguard Worker %val_regoff = load atomic i16, i16* %ptr_regoff unordered, align 2 191*9880d681SAndroid Build Coastguard Worker %tot1 = add i16 %val_unsigned, %val_regoff 192*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh {{w[0-9]+}}, [x0, w1, sxtw #1] 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker %ptr_unscaled = getelementptr i16, i16* %p, i32 -128 195*9880d681SAndroid Build Coastguard Worker %val_unscaled = load atomic i16, i16* %ptr_unscaled monotonic, align 2 196*9880d681SAndroid Build Coastguard Worker %tot2 = add i16 %tot1, %val_unscaled 197*9880d681SAndroid Build Coastguard Worker; CHECK: ldurh {{w[0-9]+}}, [x0, #-256] 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker %ptr_random = getelementptr i16, i16* %p, i32 595968 ; 0x123000/2 (i.e. ADD imm) 200*9880d681SAndroid Build Coastguard Worker %val_random = load atomic i16, i16* %ptr_random unordered, align 2 201*9880d681SAndroid Build Coastguard Worker %tot3 = add i16 %tot2, %val_random 202*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], x0, #291, lsl #12 203*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh {{w[0-9]+}}, [x[[ADDR]]] 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker ret i16 %tot3 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerdefine i32 @atomic_load_relaxed_32(i32* %p, i32 %off32) #0 { 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_load_relaxed_32: 210*9880d681SAndroid Build Coastguard Worker %ptr_unsigned = getelementptr i32, i32* %p, i32 4095 211*9880d681SAndroid Build Coastguard Worker %val_unsigned = load atomic i32, i32* %ptr_unsigned monotonic, align 4 212*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{w[0-9]+}}, [x0, #16380] 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker %ptr_regoff = getelementptr i32, i32* %p, i32 %off32 215*9880d681SAndroid Build Coastguard Worker %val_regoff = load atomic i32, i32* %ptr_regoff unordered, align 4 216*9880d681SAndroid Build Coastguard Worker %tot1 = add i32 %val_unsigned, %val_regoff 217*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{w[0-9]+}}, [x0, w1, sxtw #2] 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Worker %ptr_unscaled = getelementptr i32, i32* %p, i32 -64 220*9880d681SAndroid Build Coastguard Worker %val_unscaled = load atomic i32, i32* %ptr_unscaled monotonic, align 4 221*9880d681SAndroid Build Coastguard Worker %tot2 = add i32 %tot1, %val_unscaled 222*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{w[0-9]+}}, [x0, #-256] 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker %ptr_random = getelementptr i32, i32* %p, i32 297984 ; 0x123000/4 (i.e. ADD imm) 225*9880d681SAndroid Build Coastguard Worker %val_random = load atomic i32, i32* %ptr_random unordered, align 4 226*9880d681SAndroid Build Coastguard Worker %tot3 = add i32 %tot2, %val_random 227*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], x0, #291, lsl #12 228*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{w[0-9]+}}, [x[[ADDR]]] 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker ret i32 %tot3 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerdefine i64 @atomic_load_relaxed_64(i64* %p, i32 %off32) #0 { 234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_load_relaxed_64: 235*9880d681SAndroid Build Coastguard Worker %ptr_unsigned = getelementptr i64, i64* %p, i32 4095 236*9880d681SAndroid Build Coastguard Worker %val_unsigned = load atomic i64, i64* %ptr_unsigned monotonic, align 8 237*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [x0, #32760] 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker %ptr_regoff = getelementptr i64, i64* %p, i32 %off32 240*9880d681SAndroid Build Coastguard Worker %val_regoff = load atomic i64, i64* %ptr_regoff unordered, align 8 241*9880d681SAndroid Build Coastguard Worker %tot1 = add i64 %val_unsigned, %val_regoff 242*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [x0, w1, sxtw #3] 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker %ptr_unscaled = getelementptr i64, i64* %p, i32 -32 245*9880d681SAndroid Build Coastguard Worker %val_unscaled = load atomic i64, i64* %ptr_unscaled monotonic, align 8 246*9880d681SAndroid Build Coastguard Worker %tot2 = add i64 %tot1, %val_unscaled 247*9880d681SAndroid Build Coastguard Worker; CHECK: ldur {{x[0-9]+}}, [x0, #-256] 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker %ptr_random = getelementptr i64, i64* %p, i32 148992 ; 0x123000/8 (i.e. ADD imm) 250*9880d681SAndroid Build Coastguard Worker %val_random = load atomic i64, i64* %ptr_random unordered, align 8 251*9880d681SAndroid Build Coastguard Worker %tot3 = add i64 %tot2, %val_random 252*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], x0, #291, lsl #12 253*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [x[[ADDR]]] 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker ret i64 %tot3 256*9880d681SAndroid Build Coastguard Worker} 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdefine void @atomc_store(i32* %p) #0 { 260*9880d681SAndroid Build Coastguard Worker store atomic i32 4, i32* %p seq_cst, align 4 261*9880d681SAndroid Build Coastguard Worker ret void 262*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: atomc_store: 263*9880d681SAndroid Build Coastguard Worker ; CHECK: stlr 264*9880d681SAndroid Build Coastguard Worker} 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Workerdefine void @atomic_store_relaxed_8(i8* %p, i32 %off32, i8 %val) #0 { 267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_store_relaxed_8: 268*9880d681SAndroid Build Coastguard Worker %ptr_unsigned = getelementptr i8, i8* %p, i32 4095 269*9880d681SAndroid Build Coastguard Worker store atomic i8 %val, i8* %ptr_unsigned monotonic, align 1 270*9880d681SAndroid Build Coastguard Worker; CHECK: strb {{w[0-9]+}}, [x0, #4095] 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Worker %ptr_regoff = getelementptr i8, i8* %p, i32 %off32 273*9880d681SAndroid Build Coastguard Worker store atomic i8 %val, i8* %ptr_regoff unordered, align 1 274*9880d681SAndroid Build Coastguard Worker; CHECK: strb {{w[0-9]+}}, [x0, w1, sxtw] 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Worker %ptr_unscaled = getelementptr i8, i8* %p, i32 -256 277*9880d681SAndroid Build Coastguard Worker store atomic i8 %val, i8* %ptr_unscaled monotonic, align 1 278*9880d681SAndroid Build Coastguard Worker; CHECK: sturb {{w[0-9]+}}, [x0, #-256] 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker %ptr_random = getelementptr i8, i8* %p, i32 1191936 ; 0x123000 (i.e. ADD imm) 281*9880d681SAndroid Build Coastguard Worker store atomic i8 %val, i8* %ptr_random unordered, align 1 282*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], x0, #291, lsl #12 283*9880d681SAndroid Build Coastguard Worker; CHECK: strb {{w[0-9]+}}, [x[[ADDR]]] 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Worker ret void 286*9880d681SAndroid Build Coastguard Worker} 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Workerdefine void @atomic_store_relaxed_16(i16* %p, i32 %off32, i16 %val) #0 { 289*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_store_relaxed_16: 290*9880d681SAndroid Build Coastguard Worker %ptr_unsigned = getelementptr i16, i16* %p, i32 4095 291*9880d681SAndroid Build Coastguard Worker store atomic i16 %val, i16* %ptr_unsigned monotonic, align 2 292*9880d681SAndroid Build Coastguard Worker; CHECK: strh {{w[0-9]+}}, [x0, #8190] 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker %ptr_regoff = getelementptr i16, i16* %p, i32 %off32 295*9880d681SAndroid Build Coastguard Worker store atomic i16 %val, i16* %ptr_regoff unordered, align 2 296*9880d681SAndroid Build Coastguard Worker; CHECK: strh {{w[0-9]+}}, [x0, w1, sxtw #1] 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker %ptr_unscaled = getelementptr i16, i16* %p, i32 -128 299*9880d681SAndroid Build Coastguard Worker store atomic i16 %val, i16* %ptr_unscaled monotonic, align 2 300*9880d681SAndroid Build Coastguard Worker; CHECK: sturh {{w[0-9]+}}, [x0, #-256] 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Worker %ptr_random = getelementptr i16, i16* %p, i32 595968 ; 0x123000/2 (i.e. ADD imm) 303*9880d681SAndroid Build Coastguard Worker store atomic i16 %val, i16* %ptr_random unordered, align 2 304*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], x0, #291, lsl #12 305*9880d681SAndroid Build Coastguard Worker; CHECK: strh {{w[0-9]+}}, [x[[ADDR]]] 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker ret void 308*9880d681SAndroid Build Coastguard Worker} 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Workerdefine void @atomic_store_relaxed_32(i32* %p, i32 %off32, i32 %val) #0 { 311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_store_relaxed_32: 312*9880d681SAndroid Build Coastguard Worker %ptr_unsigned = getelementptr i32, i32* %p, i32 4095 313*9880d681SAndroid Build Coastguard Worker store atomic i32 %val, i32* %ptr_unsigned monotonic, align 4 314*9880d681SAndroid Build Coastguard Worker; CHECK: str {{w[0-9]+}}, [x0, #16380] 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker %ptr_regoff = getelementptr i32, i32* %p, i32 %off32 317*9880d681SAndroid Build Coastguard Worker store atomic i32 %val, i32* %ptr_regoff unordered, align 4 318*9880d681SAndroid Build Coastguard Worker; CHECK: str {{w[0-9]+}}, [x0, w1, sxtw #2] 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker %ptr_unscaled = getelementptr i32, i32* %p, i32 -64 321*9880d681SAndroid Build Coastguard Worker store atomic i32 %val, i32* %ptr_unscaled monotonic, align 4 322*9880d681SAndroid Build Coastguard Worker; CHECK: stur {{w[0-9]+}}, [x0, #-256] 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker %ptr_random = getelementptr i32, i32* %p, i32 297984 ; 0x123000/4 (i.e. ADD imm) 325*9880d681SAndroid Build Coastguard Worker store atomic i32 %val, i32* %ptr_random unordered, align 4 326*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], x0, #291, lsl #12 327*9880d681SAndroid Build Coastguard Worker; CHECK: str {{w[0-9]+}}, [x[[ADDR]]] 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker ret void 330*9880d681SAndroid Build Coastguard Worker} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Workerdefine void @atomic_store_relaxed_64(i64* %p, i32 %off32, i64 %val) #0 { 333*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atomic_store_relaxed_64: 334*9880d681SAndroid Build Coastguard Worker %ptr_unsigned = getelementptr i64, i64* %p, i32 4095 335*9880d681SAndroid Build Coastguard Worker store atomic i64 %val, i64* %ptr_unsigned monotonic, align 8 336*9880d681SAndroid Build Coastguard Worker; CHECK: str {{x[0-9]+}}, [x0, #32760] 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker %ptr_regoff = getelementptr i64, i64* %p, i32 %off32 339*9880d681SAndroid Build Coastguard Worker store atomic i64 %val, i64* %ptr_regoff unordered, align 8 340*9880d681SAndroid Build Coastguard Worker; CHECK: str {{x[0-9]+}}, [x0, w1, sxtw #3] 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker %ptr_unscaled = getelementptr i64, i64* %p, i32 -32 343*9880d681SAndroid Build Coastguard Worker store atomic i64 %val, i64* %ptr_unscaled monotonic, align 8 344*9880d681SAndroid Build Coastguard Worker; CHECK: stur {{x[0-9]+}}, [x0, #-256] 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker %ptr_random = getelementptr i64, i64* %p, i32 148992 ; 0x123000/8 (i.e. ADD imm) 347*9880d681SAndroid Build Coastguard Worker store atomic i64 %val, i64* %ptr_random unordered, align 8 348*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], x0, #291, lsl #12 349*9880d681SAndroid Build Coastguard Worker; CHECK: str {{x[0-9]+}}, [x[[ADDR]]] 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Worker ret void 352*9880d681SAndroid Build Coastguard Worker} 353*9880d681SAndroid Build Coastguard Worker 354*9880d681SAndroid Build Coastguard Worker; rdar://11531169 355*9880d681SAndroid Build Coastguard Worker; rdar://11531308 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker%"class.X::Atomic" = type { %struct.x_atomic_t } 358*9880d681SAndroid Build Coastguard Worker%struct.x_atomic_t = type { i32 } 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker@counter = external hidden global %"class.X::Atomic", align 4 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerdefine i32 @next_id() nounwind optsize ssp align 2 { 363*9880d681SAndroid Build Coastguard Workerentry: 364*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* getelementptr inbounds (%"class.X::Atomic", %"class.X::Atomic"* @counter, i64 0, i32 0, i32 0), i32 1 seq_cst 365*9880d681SAndroid Build Coastguard Worker %add.i = add i32 %0, 1 366*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %add.i, 0 367*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %return 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 370*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw add i32* getelementptr inbounds (%"class.X::Atomic", %"class.X::Atomic"* @counter, i64 0, i32 0, i32 0), i32 1 seq_cst 371*9880d681SAndroid Build Coastguard Worker %add.i2 = add i32 %1, 1 372*9880d681SAndroid Build Coastguard Worker br label %return 373*9880d681SAndroid Build Coastguard Worker 374*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.else, %entry 375*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %add.i2, %if.else ], [ %add.i, %entry ] 376*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 377*9880d681SAndroid Build Coastguard Worker} 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 380