1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -mtriple=armv7-linux-gnu -O0 %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -mtriple=thumbv8-linux-gnu -O0 %s -o - | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -mtriple=thumbv6m-none-eabi -O0 %s -o - | FileCheck %s --check-prefix=CHECK-T1 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK-T1-NOT: ldrex 6*9880d681SAndroid Build Coastguard Worker; CHECK-T1-NOT: strex 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine { i8, i1 } @test_cmpxchg_8(i8* %addr, i8 %desired, i8 %new) nounwind { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_8: 10*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 11*9880d681SAndroid Build Coastguard Worker; CHECK: uxtb [[DESIRED:r[0-9]+]], [[DESIRED]] 12*9880d681SAndroid Build Coastguard Worker; CHECK: [[RETRY:.LBB[0-9]+_[0-9]+]]: 13*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexb [[OLD:r[0-9]+]], [r0] 14*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[OLD]], [[DESIRED]] 15*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[DONE:.LBB[0-9]+_[0-9]+]] 16*9880d681SAndroid Build Coastguard Worker; CHECK: strexb [[STATUS:r[0-9]+]], r2, [r0] 17*9880d681SAndroid Build Coastguard Worker; CHECK: cmp{{(\.w)?}} [[STATUS]], #0 18*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[RETRY]] 19*9880d681SAndroid Build Coastguard Worker; CHECK: [[DONE]]: 20*9880d681SAndroid Build Coastguard Worker; CHECK: cmp{{(\.w)?}} [[OLD]], [[DESIRED]] 21*9880d681SAndroid Build Coastguard Worker; CHECK: {{moveq|movweq}} {{r[0-9]+}}, #1 22*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 23*9880d681SAndroid Build Coastguard Worker %res = cmpxchg i8* %addr, i8 %desired, i8 %new seq_cst monotonic 24*9880d681SAndroid Build Coastguard Worker ret { i8, i1 } %res 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine { i16, i1 } @test_cmpxchg_16(i16* %addr, i16 %desired, i16 %new) nounwind { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_16: 29*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 30*9880d681SAndroid Build Coastguard Worker; CHECK: uxth [[DESIRED:r[0-9]+]], [[DESIRED]] 31*9880d681SAndroid Build Coastguard Worker; CHECK: [[RETRY:.LBB[0-9]+_[0-9]+]]: 32*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexh [[OLD:r[0-9]+]], [r0] 33*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[OLD]], [[DESIRED]] 34*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[DONE:.LBB[0-9]+_[0-9]+]] 35*9880d681SAndroid Build Coastguard Worker; CHECK: strexh [[STATUS:r[0-9]+]], r2, [r0] 36*9880d681SAndroid Build Coastguard Worker; CHECK: cmp{{(\.w)?}} [[STATUS]], #0 37*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[RETRY]] 38*9880d681SAndroid Build Coastguard Worker; CHECK: [[DONE]]: 39*9880d681SAndroid Build Coastguard Worker; CHECK: cmp{{(\.w)?}} [[OLD]], [[DESIRED]] 40*9880d681SAndroid Build Coastguard Worker; CHECK: {{moveq|movweq}} {{r[0-9]+}}, #1 41*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 42*9880d681SAndroid Build Coastguard Worker %res = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst monotonic 43*9880d681SAndroid Build Coastguard Worker ret { i16, i1 } %res 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine { i32, i1 } @test_cmpxchg_32(i32* %addr, i32 %desired, i32 %new) nounwind { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_32: 48*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 49*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: uxt 50*9880d681SAndroid Build Coastguard Worker; CHECK: [[RETRY:.LBB[0-9]+_[0-9]+]]: 51*9880d681SAndroid Build Coastguard Worker; CHECK: ldrex [[OLD:r[0-9]+]], [r0] 52*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[OLD]], [[DESIRED]] 53*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[DONE:.LBB[0-9]+_[0-9]+]] 54*9880d681SAndroid Build Coastguard Worker; CHECK: strex [[STATUS:r[0-9]+]], r2, [r0] 55*9880d681SAndroid Build Coastguard Worker; CHECK: cmp{{(\.w)?}} [[STATUS]], #0 56*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[RETRY]] 57*9880d681SAndroid Build Coastguard Worker; CHECK: [[DONE]]: 58*9880d681SAndroid Build Coastguard Worker; CHECK: cmp{{(\.w)?}} [[OLD]], [[DESIRED]] 59*9880d681SAndroid Build Coastguard Worker; CHECK: {{moveq|movweq}} {{r[0-9]+}}, #1 60*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 61*9880d681SAndroid Build Coastguard Worker %res = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst monotonic 62*9880d681SAndroid Build Coastguard Worker ret { i32, i1 } %res 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine { i64, i1 } @test_cmpxchg_64(i64* %addr, i64 %desired, i64 %new) nounwind { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_64: 67*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 68*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: uxt 69*9880d681SAndroid Build Coastguard Worker; CHECK: [[RETRY:.LBB[0-9]+_[0-9]+]]: 70*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[OLDLO:r[0-9]+]], [[OLDHI:r[0-9]+]], [r0] 71*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[OLDLO]], r6 72*9880d681SAndroid Build Coastguard Worker; CHECK: sbcs{{(\.w)?}} [[STATUS:r[0-9]+]], [[OLDHI]], r7 73*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[DONE:.LBB[0-9]+_[0-9]+]] 74*9880d681SAndroid Build Coastguard Worker; CHECK: strexd [[STATUS]], r4, r5, [r0] 75*9880d681SAndroid Build Coastguard Worker; CHECK: cmp{{(\.w)?}} [[STATUS]], #0 76*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[RETRY]] 77*9880d681SAndroid Build Coastguard Worker; CHECK: [[DONE]]: 78*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 79*9880d681SAndroid Build Coastguard Worker %res = cmpxchg i64* %addr, i64 %desired, i64 %new seq_cst monotonic 80*9880d681SAndroid Build Coastguard Worker ret { i64, i1 } %res 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine { i64, i1 } @test_nontrivial_args(i64* %addr, i64 %desired, i64 %new) { 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_nontrivial_args: 85*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 86*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: uxt 87*9880d681SAndroid Build Coastguard Worker; CHECK: [[RETRY:.LBB[0-9]+_[0-9]+]]: 88*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[OLDLO:r[0-9]+]], [[OLDHI:r[0-9]+]], [r0] 89*9880d681SAndroid Build Coastguard Worker; CHECK: cmp [[OLDLO]], {{r[0-9]+}} 90*9880d681SAndroid Build Coastguard Worker; CHECK: sbcs{{(\.w)?}} [[STATUS:r[0-9]+]], [[OLDHI]], {{r[0-9]+}} 91*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[DONE:.LBB[0-9]+_[0-9]+]] 92*9880d681SAndroid Build Coastguard Worker; CHECK: strexd [[STATUS]], {{r[0-9]+}}, {{r[0-9]+}}, [r0] 93*9880d681SAndroid Build Coastguard Worker; CHECK: cmp{{(\.w)?}} [[STATUS]], #0 94*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[RETRY]] 95*9880d681SAndroid Build Coastguard Worker; CHECK: [[DONE]]: 96*9880d681SAndroid Build Coastguard Worker; CHECK: dmb ish 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker %desired1 = add i64 %desired, 1 99*9880d681SAndroid Build Coastguard Worker %new1 = add i64 %new, 1 100*9880d681SAndroid Build Coastguard Worker %res = cmpxchg i64* %addr, i64 %desired1, i64 %new1 seq_cst seq_cst 101*9880d681SAndroid Build Coastguard Worker ret { i64, i1 } %res 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; The following used to trigger an assertion when creating a spill on thumb2 105*9880d681SAndroid Build Coastguard Worker; for a physreg with RC==GPRPairRegClass. 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_spillbug: 107*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd 108*9880d681SAndroid Build Coastguard Worker; CHECK: strexd 109*9880d681SAndroid Build Coastguard Worker; CHECK: bne 110*9880d681SAndroid Build Coastguard Workerdefine void @test_cmpxchg_spillbug() { 111*9880d681SAndroid Build Coastguard Worker %v = cmpxchg i64* undef, i64 undef, i64 undef seq_cst seq_cst 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114