1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=CHECK --check-prefix CHECK-ARMV7 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-T2 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv6-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-T1 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv6-apple-ios -verify-machineinstrs -mcpu=cortex-m0 | FileCheck %s --check-prefix=CHECK-T1 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7--none-eabi -thread-model single -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-BAREMETAL 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine void @func(i32 %argc, i8** %argv) nounwind { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker %argc.addr = alloca i32 ; <i32*> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker %argv.addr = alloca i8** ; <i8***> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %val1 = alloca i32 ; <i32*> [#uses=2] 14*9880d681SAndroid Build Coastguard Worker %val2 = alloca i32 ; <i32*> [#uses=15] 15*9880d681SAndroid Build Coastguard Worker %andt = alloca i32 ; <i32*> [#uses=2] 16*9880d681SAndroid Build Coastguard Worker %ort = alloca i32 ; <i32*> [#uses=2] 17*9880d681SAndroid Build Coastguard Worker %xort = alloca i32 ; <i32*> [#uses=2] 18*9880d681SAndroid Build Coastguard Worker %old = alloca i32 ; <i32*> [#uses=18] 19*9880d681SAndroid Build Coastguard Worker %temp = alloca i32 ; <i32*> [#uses=2] 20*9880d681SAndroid Build Coastguard Worker store i32 %argc, i32* %argc.addr 21*9880d681SAndroid Build Coastguard Worker store i8** %argv, i8*** %argv.addr 22*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %val1 23*9880d681SAndroid Build Coastguard Worker store i32 31, i32* %val2 24*9880d681SAndroid Build Coastguard Worker store i32 3855, i32* %andt 25*9880d681SAndroid Build Coastguard Worker store i32 3855, i32* %ort 26*9880d681SAndroid Build Coastguard Worker store i32 3855, i32* %xort 27*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %temp 28*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %temp 29*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 30*9880d681SAndroid Build Coastguard Worker ; CHECK: add 31*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 32*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_add_4 33*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: add 34*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 35*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* %val1, i32 %tmp monotonic 36*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %old 37*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 38*9880d681SAndroid Build Coastguard Worker ; CHECK: sub 39*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 40*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_sub_4 41*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: sub 42*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 43*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw sub i32* %val2, i32 30 monotonic 44*9880d681SAndroid Build Coastguard Worker store i32 %1, i32* %old 45*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 46*9880d681SAndroid Build Coastguard Worker ; CHECK: add 47*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 48*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_add_4 49*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: add 50*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 51*9880d681SAndroid Build Coastguard Worker %2 = atomicrmw add i32* %val2, i32 1 monotonic 52*9880d681SAndroid Build Coastguard Worker store i32 %2, i32* %old 53*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 54*9880d681SAndroid Build Coastguard Worker ; CHECK: sub 55*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 56*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_sub_4 57*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: sub 58*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 59*9880d681SAndroid Build Coastguard Worker %3 = atomicrmw sub i32* %val2, i32 1 monotonic 60*9880d681SAndroid Build Coastguard Worker store i32 %3, i32* %old 61*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 62*9880d681SAndroid Build Coastguard Worker ; CHECK: and 63*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 64*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_and_4 65*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: and 66*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 67*9880d681SAndroid Build Coastguard Worker %4 = atomicrmw and i32* %andt, i32 4080 monotonic 68*9880d681SAndroid Build Coastguard Worker store i32 %4, i32* %old 69*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 70*9880d681SAndroid Build Coastguard Worker ; CHECK: or 71*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 72*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_or_4 73*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: or 74*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 75*9880d681SAndroid Build Coastguard Worker %5 = atomicrmw or i32* %ort, i32 4080 monotonic 76*9880d681SAndroid Build Coastguard Worker store i32 %5, i32* %old 77*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 78*9880d681SAndroid Build Coastguard Worker ; CHECK: eor 79*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 80*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_xor_4 81*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: eor 82*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 83*9880d681SAndroid Build Coastguard Worker %6 = atomicrmw xor i32* %xort, i32 4080 monotonic 84*9880d681SAndroid Build Coastguard Worker store i32 %6, i32* %old 85*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 86*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 87*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 88*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_min_4 89*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 90*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 91*9880d681SAndroid Build Coastguard Worker %7 = atomicrmw min i32* %val2, i32 16 monotonic 92*9880d681SAndroid Build Coastguard Worker store i32 %7, i32* %old 93*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, 1 94*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 95*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 96*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 97*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_min_4 98*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 99*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 100*9880d681SAndroid Build Coastguard Worker %8 = atomicrmw min i32* %val2, i32 %neg monotonic 101*9880d681SAndroid Build Coastguard Worker store i32 %8, i32* %old 102*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 103*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 104*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 105*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_max_4 106*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 107*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 108*9880d681SAndroid Build Coastguard Worker %9 = atomicrmw max i32* %val2, i32 1 monotonic 109*9880d681SAndroid Build Coastguard Worker store i32 %9, i32* %old 110*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 111*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 112*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 113*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_max_4 114*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 115*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 116*9880d681SAndroid Build Coastguard Worker %10 = atomicrmw max i32* %val2, i32 0 monotonic 117*9880d681SAndroid Build Coastguard Worker store i32 %10, i32* %old 118*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 119*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 120*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 121*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umin_4 122*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 123*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 124*9880d681SAndroid Build Coastguard Worker %11 = atomicrmw umin i32* %val2, i32 16 monotonic 125*9880d681SAndroid Build Coastguard Worker store i32 %11, i32* %old 126*9880d681SAndroid Build Coastguard Worker %uneg = sub i32 0, 1 127*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 128*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 129*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 130*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umin_4 131*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 132*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 133*9880d681SAndroid Build Coastguard Worker %12 = atomicrmw umin i32* %val2, i32 %uneg monotonic 134*9880d681SAndroid Build Coastguard Worker store i32 %12, i32* %old 135*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 136*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 137*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 138*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umax_4 139*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 140*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 141*9880d681SAndroid Build Coastguard Worker %13 = atomicrmw umax i32* %val2, i32 1 monotonic 142*9880d681SAndroid Build Coastguard Worker store i32 %13, i32* %old 143*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 144*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 145*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 146*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umax_4 147*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 148*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 149*9880d681SAndroid Build Coastguard Worker %14 = atomicrmw umax i32* %val2, i32 0 monotonic 150*9880d681SAndroid Build Coastguard Worker store i32 %14, i32* %old 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker ret void 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine void @func2() nounwind { 156*9880d681SAndroid Build Coastguard Workerentry: 157*9880d681SAndroid Build Coastguard Worker %val = alloca i16 158*9880d681SAndroid Build Coastguard Worker %old = alloca i16 159*9880d681SAndroid Build Coastguard Worker store i16 31, i16* %val 160*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 161*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 162*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 163*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umin_2 164*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 165*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 166*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw umin i16* %val, i16 16 monotonic 167*9880d681SAndroid Build Coastguard Worker store i16 %0, i16* %old 168*9880d681SAndroid Build Coastguard Worker %uneg = sub i16 0, 1 169*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 170*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 171*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 172*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umin_2 173*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 174*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 175*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw umin i16* %val, i16 %uneg monotonic 176*9880d681SAndroid Build Coastguard Worker store i16 %1, i16* %old 177*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 178*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 179*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 180*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umax_2 181*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 182*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 183*9880d681SAndroid Build Coastguard Worker %2 = atomicrmw umax i16* %val, i16 1 monotonic 184*9880d681SAndroid Build Coastguard Worker store i16 %2, i16* %old 185*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 186*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 187*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 188*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umax_2 189*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 190*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 191*9880d681SAndroid Build Coastguard Worker %3 = atomicrmw umax i16* %val, i16 0 monotonic 192*9880d681SAndroid Build Coastguard Worker store i16 %3, i16* %old 193*9880d681SAndroid Build Coastguard Worker ret void 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdefine void @func3() nounwind { 197*9880d681SAndroid Build Coastguard Workerentry: 198*9880d681SAndroid Build Coastguard Worker %val = alloca i8 199*9880d681SAndroid Build Coastguard Worker %old = alloca i8 200*9880d681SAndroid Build Coastguard Worker store i8 31, i8* %val 201*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 202*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 203*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 204*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umin_1 205*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 206*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 207*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw umin i8* %val, i8 16 monotonic 208*9880d681SAndroid Build Coastguard Worker store i8 %0, i8* %old 209*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 210*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 211*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 212*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umin_1 213*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 214*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 215*9880d681SAndroid Build Coastguard Worker %uneg = sub i8 0, 1 216*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw umin i8* %val, i8 %uneg monotonic 217*9880d681SAndroid Build Coastguard Worker store i8 %1, i8* %old 218*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 219*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 220*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 221*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umax_1 222*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 223*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 224*9880d681SAndroid Build Coastguard Worker %2 = atomicrmw umax i8* %val, i8 1 monotonic 225*9880d681SAndroid Build Coastguard Worker store i8 %2, i8* %old 226*9880d681SAndroid Build Coastguard Worker ; CHECK: ldrex 227*9880d681SAndroid Build Coastguard Worker ; CHECK: cmp 228*9880d681SAndroid Build Coastguard Worker ; CHECK: strex 229*9880d681SAndroid Build Coastguard Worker ; CHECK-T1: bl ___sync_fetch_and_umax_1 230*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL: cmp 231*9880d681SAndroid Build Coastguard Worker ; CHECK-BAREMETAL-NOT: __sync 232*9880d681SAndroid Build Coastguard Worker %3 = atomicrmw umax i8* %val, i8 0 monotonic 233*9880d681SAndroid Build Coastguard Worker store i8 %3, i8* %old 234*9880d681SAndroid Build Coastguard Worker ret void 235*9880d681SAndroid Build Coastguard Worker} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker; CHECK: func4 238*9880d681SAndroid Build Coastguard Worker; This function should not need to use callee-saved registers. 239*9880d681SAndroid Build Coastguard Worker; rdar://problem/12203728 240*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: r4 241*9880d681SAndroid Build Coastguard Workerdefine i32 @func4(i32* %p) nounwind optsize ssp { 242*9880d681SAndroid Build Coastguard Workerentry: 243*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* %p, i32 1 monotonic 244*9880d681SAndroid Build Coastguard Worker ret i32 %0 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdefine i32 @test_cmpxchg_fail_order(i32 *%addr, i32 %desired, i32 %new) { 248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_fail_order: 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst monotonic 251*9880d681SAndroid Build Coastguard Worker %oldval = extractvalue { i32, i1 } %pair, 0 252*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: ldrex [[OLDVAL:r[0-9]+]], [r[[ADDR:[0-9]+]]] 253*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: cmp [[OLDVAL]], r1 254*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: bne [[FAIL_BB:\.?LBB[0-9]+_[0-9]+]] 255*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: dmb ish 256*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: [[LOOP_BB:\.?LBB.*]]: 257*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: strex [[SUCCESS:r[0-9]+]], r2, [r[[ADDR]]] 258*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: cmp [[SUCCESS]], #0 259*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: beq [[SUCCESS_BB:\.?LBB.*]] 260*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: ldrex [[OLDVAL]], [r[[ADDR]]] 261*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: cmp [[OLDVAL]], r1 262*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: beq [[LOOP_BB]] 263*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: [[FAIL_BB]]: 264*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: clrex 265*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: bx lr 266*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: [[SUCCESS_BB]]: 267*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: dmb ish 268*9880d681SAndroid Build Coastguard Worker; CHECK-ARMV7: bx lr 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrex [[OLDVAL:r[0-9]+]], [r[[ADDR:[0-9]+]]] 271*9880d681SAndroid Build Coastguard Worker; CHECK-T2: cmp [[OLDVAL]], r1 272*9880d681SAndroid Build Coastguard Worker; CHECK-T2: bne [[FAIL_BB:\.?LBB.*]] 273*9880d681SAndroid Build Coastguard Worker; CHECK-T2: dmb ish 274*9880d681SAndroid Build Coastguard Worker; CHECK-T2: [[LOOP_BB:\.?LBB.*]]: 275*9880d681SAndroid Build Coastguard Worker; CHECK-T2: strex [[SUCCESS:r[0-9]+]], r2, [r[[ADDR]]] 276*9880d681SAndroid Build Coastguard Worker; CHECK-T2: cmp [[SUCCESS]], #0 277*9880d681SAndroid Build Coastguard Worker; CHECK-T2: dmbeq ish 278*9880d681SAndroid Build Coastguard Worker; CHECK-T2: bxeq lr 279*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrex [[OLDVAL]], [r[[ADDR]]] 280*9880d681SAndroid Build Coastguard Worker; CHECK-T2: cmp [[OLDVAL]], r1 281*9880d681SAndroid Build Coastguard Worker; CHECK-T2: beq [[LOOP_BB]] 282*9880d681SAndroid Build Coastguard Worker; CHECK-T2: clrex 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Worker ret i32 %oldval 285*9880d681SAndroid Build Coastguard Worker} 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Workerdefine i32 @test_cmpxchg_fail_order1(i32 *%addr, i32 %desired, i32 %new) { 288*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_fail_order1: 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i32* %addr, i32 %desired, i32 %new acquire acquire 291*9880d681SAndroid Build Coastguard Worker %oldval = extractvalue { i32, i1 } %pair, 0 292*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: dmb ish 293*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP_BB:\.?LBB[0-9]+_1]]: 294*9880d681SAndroid Build Coastguard Worker; CHECK: ldrex [[OLDVAL:r[0-9]+]], [r[[ADDR:[0-9]+]]] 295*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[OLDVAL]], r1 296*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[FAIL_BB:\.?LBB[0-9]+_[0-9]+]] 297*9880d681SAndroid Build Coastguard Worker; CHECK: strex [[SUCCESS:r[0-9]+]], r2, [r[[ADDR]]] 298*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[SUCCESS]], #0 299*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[LOOP_BB]] 300*9880d681SAndroid Build Coastguard Worker; CHECK: b [[END_BB:\.?LBB[0-9]+_[0-9]+]] 301*9880d681SAndroid Build Coastguard Worker; CHECK: [[FAIL_BB]]: 302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: clrex 303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[END_BB]]: 304*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 305*9880d681SAndroid Build Coastguard Worker; CHECK: bx lr 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker ret i32 %oldval 308*9880d681SAndroid Build Coastguard Worker} 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Workerdefine i32 @load_load_add_acquire(i32* %mem1, i32* %mem2) nounwind { 311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_load_add_acquire 312*9880d681SAndroid Build Coastguard Worker %val1 = load atomic i32, i32* %mem1 acquire, align 4 313*9880d681SAndroid Build Coastguard Worker %val2 = load atomic i32, i32* %mem2 acquire, align 4 314*9880d681SAndroid Build Coastguard Worker %tmp = add i32 %val1, %val2 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{r[0-9]}}, [r0] 317*9880d681SAndroid Build Coastguard Worker; CHECK: dmb 318*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{r[0-9]}}, [r1] 319*9880d681SAndroid Build Coastguard Worker; CHECK: dmb 320*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ___sync_val_compare_and_swap_4 323*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ___sync_val_compare_and_swap_4 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL: ldr {{r[0-9]}}, [r0] 326*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL-NOT: dmb 327*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL: ldr {{r[0-9]}}, [r1] 328*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL-NOT: dmb 329*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL: add r0, 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 332*9880d681SAndroid Build Coastguard Worker} 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Workerdefine void @store_store_release(i32* %mem1, i32 %val1, i32* %mem2, i32 %val2) { 335*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_store_release 336*9880d681SAndroid Build Coastguard Worker store atomic i32 %val1, i32* %mem1 release, align 4 337*9880d681SAndroid Build Coastguard Worker store atomic i32 %val2, i32* %mem2 release, align 4 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker; CHECK: dmb 340*9880d681SAndroid Build Coastguard Worker; CHECK: str r1, [r0] 341*9880d681SAndroid Build Coastguard Worker; CHECK: dmb 342*9880d681SAndroid Build Coastguard Worker; CHECK: str r3, [r2] 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ___sync_lock_test_and_set 345*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ___sync_lock_test_and_set 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL-NOT: dmb 348*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMTEAL: str r1, [r0] 349*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL-NOT: dmb 350*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMTEAL: str r3, [r2] 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Worker ret void 353*9880d681SAndroid Build Coastguard Worker} 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Workerdefine void @load_fence_store_monotonic(i32* %mem1, i32* %mem2) { 356*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_fence_store_monotonic 357*9880d681SAndroid Build Coastguard Worker %val = load atomic i32, i32* %mem1 monotonic, align 4 358*9880d681SAndroid Build Coastguard Worker fence seq_cst 359*9880d681SAndroid Build Coastguard Worker store atomic i32 %val, i32* %mem2 monotonic, align 4 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[R0:r[0-9]]], [r0] 362*9880d681SAndroid Build Coastguard Worker; CHECK: dmb 363*9880d681SAndroid Build Coastguard Worker; CHECK: str [[R0]], [r1] 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr [[R0:r[0-9]]], [{{r[0-9]+}}] 366*9880d681SAndroid Build Coastguard Worker; CHECK-T1: {{dmb|bl ___sync_synchronize}} 367*9880d681SAndroid Build Coastguard Worker; CHECK-T1: str [[R0]], [{{r[0-9]+}}] 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL: ldr [[R0:r[0-9]]], [r0] 370*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL-NOT: dmb 371*9880d681SAndroid Build Coastguard Worker; CHECK-BAREMETAL: str [[R0]], [r1] 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Worker ret void 374*9880d681SAndroid Build Coastguard Worker} 375