1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LE 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB --check-prefix=CHECK-THUMB-LE 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armebv7 -target-abi apcs | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbebv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB --check-prefix=CHECK-THUMB-BE 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i64 @test1(i64* %ptr, i64 %val) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 9*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 10*9880d681SAndroid Build Coastguard Worker; CHECK-LE: adds [[REG3:(r[0-9]?[02468])]], [[REG1]] 11*9880d681SAndroid Build Coastguard Worker; CHECK-LE: adc [[REG4:(r[0-9]?[13579])]], [[REG2]] 12*9880d681SAndroid Build Coastguard Worker; CHECK-BE: adds [[REG4:(r[0-9]?[13579])]], [[REG2]] 13*9880d681SAndroid Build Coastguard Worker; CHECK-BE: adc [[REG3:(r[0-9]?[02468])]], [[REG1]] 14*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 15*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 16*9880d681SAndroid Build Coastguard Worker; CHECK: bne 17*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test1: 20*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 21*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 22*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: adds.w [[REG3:[a-z0-9]+]], [[REG1]] 23*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: adc.w [[REG4:[a-z0-9]+]], [[REG2]] 24*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: adds.w [[REG4:[a-z0-9]+]], [[REG2]] 25*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: adc.w [[REG3:[a-z0-9]+]], [[REG1]] 26*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 27*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 28*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 29*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker %r = atomicrmw add i64* %ptr, i64 %val seq_cst 32*9880d681SAndroid Build Coastguard Worker ret i64 %r 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine i64 @test2(i64* %ptr, i64 %val) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 37*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 38*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 39*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs [[REG3:(r[0-9]?[02468])]], [[REG1]] 40*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbc [[REG4:(r[0-9]?[13579])]], [[REG2]] 41*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs [[REG4:(r[0-9]?[13579])]], [[REG2]] 42*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbc [[REG3:(r[0-9]?[02468])]], [[REG1]] 43*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 44*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 45*9880d681SAndroid Build Coastguard Worker; CHECK: bne 46*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test2: 49*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 50*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 51*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w [[REG3:[a-z0-9]+]], [[REG1]] 52*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbc.w [[REG4:[a-z0-9]+]], [[REG2]] 53*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w [[REG4:[a-z0-9]+]], [[REG2]] 54*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbc.w [[REG3:[a-z0-9]+]], [[REG1]] 55*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 56*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 57*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 58*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker %r = atomicrmw sub i64* %ptr, i64 %val seq_cst 61*9880d681SAndroid Build Coastguard Worker ret i64 %r 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64* %ptr, i64 %val) { 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 66*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 67*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 68*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: and [[REG3:(r[0-9]?[02468])]], [[REG1]] 69*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: and [[REG4:(r[0-9]?[13579])]], [[REG2]] 70*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: and [[REG4:(r[0-9]?[13579])]], [[REG2]] 71*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: and [[REG3:(r[0-9]?[02468])]], [[REG1]] 72*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 73*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 74*9880d681SAndroid Build Coastguard Worker; CHECK: bne 75*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test3: 78*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 79*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 80*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: and.w [[REG3:[a-z0-9]+]], [[REG1]] 81*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: and.w [[REG4:[a-z0-9]+]], [[REG2]] 82*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: and.w [[REG4:[a-z0-9]+]], [[REG2]] 83*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: and.w [[REG3:[a-z0-9]+]], [[REG1]] 84*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 85*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 86*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 87*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker %r = atomicrmw and i64* %ptr, i64 %val seq_cst 90*9880d681SAndroid Build Coastguard Worker ret i64 %r 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i64 @test4(i64* %ptr, i64 %val) { 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 95*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 96*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 97*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: orr [[REG3:(r[0-9]?[02468])]], [[REG1]] 98*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: orr [[REG4:(r[0-9]?[13579])]], [[REG2]] 99*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: orr [[REG4:(r[0-9]?[13579])]], [[REG2]] 100*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: orr [[REG3:(r[0-9]?[02468])]], [[REG1]] 101*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 102*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 103*9880d681SAndroid Build Coastguard Worker; CHECK: bne 104*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test4: 107*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 108*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 109*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: orr.w [[REG3:[a-z0-9]+]], [[REG1]] 110*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: orr.w [[REG4:[a-z0-9]+]], [[REG2]] 111*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: orr.w [[REG4:[a-z0-9]+]], [[REG2]] 112*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: orr.w [[REG3:[a-z0-9]+]], [[REG1]] 113*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 114*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 115*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 116*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker %r = atomicrmw or i64* %ptr, i64 %val seq_cst 119*9880d681SAndroid Build Coastguard Worker ret i64 %r 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerdefine i64 @test5(i64* %ptr, i64 %val) { 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 124*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 125*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 126*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: eor [[REG3:(r[0-9]?[02468])]], [[REG1]] 127*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: eor [[REG4:(r[0-9]?[13579])]], [[REG2]] 128*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: eor [[REG4:(r[0-9]?[13579])]], [[REG2]] 129*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: eor [[REG3:(r[0-9]?[02468])]], [[REG1]] 130*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 131*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 132*9880d681SAndroid Build Coastguard Worker; CHECK: bne 133*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test5: 136*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 137*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 138*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: eor.w [[REG3:[a-z0-9]+]], [[REG1]] 139*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: eor.w [[REG4:[a-z0-9]+]], [[REG2]] 140*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: eor.w [[REG4:[a-z0-9]+]], [[REG2]] 141*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: eor.w [[REG3:[a-z0-9]+]], [[REG1]] 142*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] 143*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 144*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 145*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker %r = atomicrmw xor i64* %ptr, i64 %val seq_cst 148*9880d681SAndroid Build Coastguard Worker ret i64 %r 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i64 @test6(i64* %ptr, i64 %val) { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 153*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 154*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 155*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} 156*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 157*9880d681SAndroid Build Coastguard Worker; CHECK: bne 158*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test6: 161*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 162*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 163*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}} 164*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 165*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 166*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker %r = atomicrmw xchg i64* %ptr, i64 %val seq_cst 169*9880d681SAndroid Build Coastguard Worker ret i64 %r 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdefine i64 @test7(i64* %ptr, i64 %val1, i64 %val2) { 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 174*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: mov [[VAL1LO:r[0-9]+]], r1 175*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 176*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: eor [[MISMATCH_LO:.*]], [[REG1]], [[VAL1LO]] 177*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: eor [[MISMATCH_HI:.*]], [[REG2]], r2 178*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: eor [[MISMATCH_LO:.*]], [[REG2]], r2 179*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: eor [[MISMATCH_HI:.*]], [[REG1]], r1 180*9880d681SAndroid Build Coastguard Worker; CHECK: orrs {{r[0-9]+}}, [[MISMATCH_LO]], [[MISMATCH_HI]] 181*9880d681SAndroid Build Coastguard Worker; CHECK: bne 182*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: dmb {{ish$}} 183*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} 184*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 185*9880d681SAndroid Build Coastguard Worker; CHECK: beq 186*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test7: 189*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 190*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: eor.w [[MISMATCH_LO:[a-z0-9]+]], [[REG1]], r2 191*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: eor.w [[MISMATCH_HI:[a-z0-9]+]], [[REG2]], r3 192*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: eor.w [[MISMATCH_HI:[a-z0-9]+]], [[REG1]], r2 193*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: eor.w [[MISMATCH_LO:[a-z0-9]+]], [[REG2]], r3 194*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: orrs.w {{.*}}, [[MISMATCH_LO]], [[MISMATCH_HI]] 195*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 196*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 197*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}} 198*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 199*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: beq 200*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i64* %ptr, i64 %val1, i64 %val2 seq_cst seq_cst 203*9880d681SAndroid Build Coastguard Worker %r = extractvalue { i64, i1 } %pair, 0 204*9880d681SAndroid Build Coastguard Worker ret i64 %r 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; Compiles down to a single ldrexd 208*9880d681SAndroid Build Coastguard Workerdefine i64 @test8(i64* %ptr) { 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8: 210*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 211*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: strexd 212*9880d681SAndroid Build Coastguard Worker; CHECK: clrex 213*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: strexd 214*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test8: 217*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 218*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-NOT: strexd 219*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: clrex 220*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-NOT: strexd 221*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker %r = load atomic i64, i64* %ptr seq_cst, align 8 224*9880d681SAndroid Build Coastguard Worker ret i64 %r 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker; Compiles down to atomicrmw xchg; there really isn't any more efficient 228*9880d681SAndroid Build Coastguard Worker; way to write it. 229*9880d681SAndroid Build Coastguard Workerdefine void @test9(i64* %ptr, i64 %val) { 230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9: 231*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 232*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 233*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} 234*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 235*9880d681SAndroid Build Coastguard Worker; CHECK: bne 236*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test9: 239*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 240*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 241*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}} 242*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 243*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 244*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker store atomic i64 %val, i64* %ptr seq_cst, align 8 247*9880d681SAndroid Build Coastguard Worker ret void 248*9880d681SAndroid Build Coastguard Worker} 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerdefine i64 @test10(i64* %ptr, i64 %val) { 251*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10: 252*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 253*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 254*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2 255*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]] 256*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]] 257*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]] 258*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]] 259*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[CMP:[a-z0-9]+]], #0 260*9880d681SAndroid Build Coastguard Worker; CHECK: movwge [[CMP]], #1 261*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[CMP]], #0 262*9880d681SAndroid Build Coastguard Worker; CHECK: movne [[OUT_HI]], [[REG2]] 263*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1 264*9880d681SAndroid Build Coastguard Worker; CHECK: movne [[OUT_LO]], [[REG1]] 265*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]] 266*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 267*9880d681SAndroid Build Coastguard Worker; CHECK: bne 268*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test10: 271*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 272*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 273*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2 274*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]] 275*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]] 276*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]] 277*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]] 278*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov.w [[CMP:[a-z0-9]+]], #0 279*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movge.w [[CMP]], #1 280*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp.w [[CMP]], #0 281*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3 282*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne [[OUT_HI]], [[REG2]] 283*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne [[OUT_LO]], [[REG1]] 284*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]] 285*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 286*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 287*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Worker %r = atomicrmw min i64* %ptr, i64 %val seq_cst 290*9880d681SAndroid Build Coastguard Worker ret i64 %r 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Workerdefine i64 @test11(i64* %ptr, i64 %val) { 294*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11: 295*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 296*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 297*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2 298*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]] 299*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]] 300*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]] 301*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]] 302*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[CMP:[a-z0-9]+]], #0 303*9880d681SAndroid Build Coastguard Worker; CHECK: movwhs [[CMP]], #1 304*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[CMP]], #0 305*9880d681SAndroid Build Coastguard Worker; CHECK: movne [[OUT_HI]], [[REG2]] 306*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1 307*9880d681SAndroid Build Coastguard Worker; CHECK: movne [[OUT_LO]], [[REG1]] 308*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]] 309*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 310*9880d681SAndroid Build Coastguard Worker; CHECK: bne 311*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test11: 314*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 315*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 316*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2 317*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]] 318*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]] 319*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]] 320*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]] 321*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov.w [[CMP:[a-z0-9]+]], #0 322*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movhs.w [[CMP]], #1 323*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp.w [[CMP]], #0 324*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3 325*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne [[OUT_HI]], [[REG2]] 326*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne [[OUT_LO]], [[REG1]] 327*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]] 328*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 329*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 330*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Worker %r = atomicrmw umin i64* %ptr, i64 %val seq_cst 333*9880d681SAndroid Build Coastguard Worker ret i64 %r 334*9880d681SAndroid Build Coastguard Worker} 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Workerdefine i64 @test12(i64* %ptr, i64 %val) { 337*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12: 338*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 339*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 340*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2 341*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]] 342*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]] 343*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]] 344*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]] 345*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[CMP:[a-z0-9]+]], #0 346*9880d681SAndroid Build Coastguard Worker; CHECK: movwlt [[CMP]], #1 347*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[CMP]], #0 348*9880d681SAndroid Build Coastguard Worker; CHECK: movne [[OUT_HI]], [[REG2]] 349*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1 350*9880d681SAndroid Build Coastguard Worker; CHECK: movne [[OUT_LO]], [[REG1]] 351*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]] 352*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 353*9880d681SAndroid Build Coastguard Worker; CHECK: bne 354*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test12: 357*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 358*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 359*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2 360*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]] 361*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]] 362*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]] 363*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]] 364*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov.w [[CMP:[a-z0-9]+]], #0 365*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movlt.w [[CMP]], #1 366*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp.w [[CMP]], #0 367*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3 368*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne [[OUT_HI]], [[REG2]] 369*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne [[OUT_LO]], [[REG1]] 370*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]] 371*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 372*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 373*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Worker %r = atomicrmw max i64* %ptr, i64 %val seq_cst 376*9880d681SAndroid Build Coastguard Worker ret i64 %r 377*9880d681SAndroid Build Coastguard Worker} 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Workerdefine i64 @test13(i64* %ptr, i64 %val) { 380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13: 381*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 382*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] 383*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2 384*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]] 385*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]] 386*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]] 387*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]] 388*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[CMP:[a-z0-9]+]], #0 389*9880d681SAndroid Build Coastguard Worker; CHECK: movwlo [[CMP]], #1 390*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[CMP]], #0 391*9880d681SAndroid Build Coastguard Worker; CHECK: movne [[OUT_HI]], [[REG2]] 392*9880d681SAndroid Build Coastguard Worker; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1 393*9880d681SAndroid Build Coastguard Worker; CHECK: movne [[OUT_LO]], [[REG1]] 394*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]] 395*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 396*9880d681SAndroid Build Coastguard Worker; CHECK: bne 397*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}} 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test13: 400*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 401*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] 402*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2 403*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]] 404*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]] 405*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]] 406*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]] 407*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov.w [[CMP:[a-z0-9]+]], #0 408*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movlo.w [[CMP]], #1 409*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp.w [[CMP]], #0 410*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3 411*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne [[OUT_HI]], [[REG2]] 412*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne [[OUT_LO]], [[REG1]] 413*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]] 414*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp 415*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne 416*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}} 417*9880d681SAndroid Build Coastguard Worker %r = atomicrmw umax i64* %ptr, i64 %val seq_cst 418*9880d681SAndroid Build Coastguard Worker ret i64 %r 419*9880d681SAndroid Build Coastguard Worker} 420*9880d681SAndroid Build Coastguard Worker 421